2010-05-26 10 views
10

Buna benzer koduyla PreparedStatement kullanmaya çalışıyorum: AçıkçasıPreparedStatement.setString() yöntemi

SELECT * FROM ? WHERE name = ? 

, ben setString kullandığınızda() masa ve adı alanıdır ayarlamak için ne Bu:

ve sorgu çalışmıyor.

SELECT * FROM my_table WHERE name = 'whatever' 

veya bu savların hiçbiri sisteminin, başka bir bölümünden gelen (sadece vazgeçmek ve bunları normal Bildirimi kullanmalıdır: satır şuna benzer şekilde tırnak işaretleri olmadan Dize ayarlamak için bir yolu var mı bir kullanıcı tarafından girilir)?

+0

Bunu yaparken düşünürken aslında verilerinizi remodeling düşünmelisiniz bana önerir. Belki de tüm tabloları birleştiren bir görünüm eklemelisiniz, eklenmiş bir sütun 'tablo adı'. – nsayer

cevap

15

Parametreler, tabloyu parametrelemek veya herhangi bir veritabanı nesnesini parametrelemek için kullanılamaz. Genellikle WHERE/HAVING cümleciklerini parametrelemek için kullanılırlar.

İstediğinizi yapmak için, ikame işlemini kendiniz yapmanız ve gerektiğinde düzenli bir ifade oluşturmanız gerekir.

Hazırlanmış bir deyim kullandığınızda, bu, veritabanında ön işlemeyi gerçekleştiren bir ipucudur - örn. dizeyi ayrıştırır ve muhtemelen bir yürütme planı belirler. Sorguda kullanılan nesneler dinamik olarak değişebilirse, veritabanı ön hazırlığı çok fazla yapamaz.

+0

Bunu yapmak için, setString kullanarak dizeleri tırnak içine koyar, çünkü (değişkenler bu şekilde işe yaramaz). Sorgunun bu kısmı için bir değişken kullanamazsınız. – Donnie

+0

Anladım, teşekkürler! Hazırlayanlar, kullanıcılara girilmediği için PreparedStatement dozunu çok anlamlı bulmamanızı söyler misiniz? Demek istediğim, düzenli bir ifadeyle daha pahalıya mal oluyor. Ya da ne olursa olsun her yerde PreparedStatement kullanmalı mıyım? – Slavko

+1

Halihazırda bir PreparedStatement kullanabilirsiniz, sadece tablo adını parametrelemeye çalışmayın - 'kim' parametresini parametreleyin. Düzenli ve düzenli ifadelerin kullanımı ile ilgili bazı tartışmalar vardır, fakat ben, iyi bir gerekçe göstermedikçe, fikir birliği hazır ifadeleri kullanmak olduğuna inanıyorum. – mdma

2

Maalesef, hazırlanan ifadeler için tablo adlarını parametreleyemezsiniz. İstenirse, bir Dize oluşturabilir ve dinamik SQL olarak çalıştırabilirsiniz.

3

SQL'inizin bu şekilde sonsuz derecede esnek olduğundan şüpheliyim. Yalnızca sınırlı sayıda tablo var, bu yüzden ihtiyacınız olan SQL'i ifade etmek için statik son Dizge sayısı da sonludur.

Kullanıma hazır DeğişkenlerDüzenleme ve değişkenlerinizi bağlama. Tamamen buna değer, özellikle SQL enjeksiyon problemlerinden kaçındığınızda yardımcı olun.

+0

Açıkça yeterli TheDailywtf.com okumadınız. Müşteri başına bir tabloya sahip olmak (Ve müşteri sayısı bağlı değildir) kullanılan bir anti desendir. –

+0

Görünüşe göre değil. Başların için teşekkürler. 8) – duffymo

2

Yaptığınız hata, numaralı tablonun tablo adını parametresi olarak geçememesidir. Değerleri yalnızca bir SQL deyimine iletmelisiniz.

Ör: Eğer wantto iseniz:

Select * from LoggedUsers where username='whatever' and privilege='whatever'; 

o zaman sen PreparedStatement inşa etmek ettik:

PreparedStatement amacı zorluğunu ve okunabilirliği azaltmaktır
Select * from LoggedUsers where username=? and privilege=? 

setString(1, usernameObject); 
setString(2, privilegeObject); 

veritabanı bağlantı kodu., geliştiricinin deyimiyle çok fazla sütun değeri kullanması gerektiğinde, noktalı virgül, virgül ve artı (concat operatörü) koymak çok zor.

Ben yanlışlıkla olmak için tasarlanmamıştır ondan faydalanmak, almak istedim düşünüyorum

....