2011-06-13 27 views
21

Aşağıdaki DB yardımcı sınıf var:SQLite İstisna seçmeye çalışırken böyle bir sütun

public int studentExists(String studid) { 
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null); 
    dataCount.moveToFirst(); 
    int count = dataCount.getInt(0); 
    dataCount.close(); 
    return count; 
} 

Ben bir öğrenci kimliği önceden girilmiş olup olmadığını görmek için benim app kullanacağız.

Bu, öğrenci kimlikleri ints (346742) olduğunda, ancak alfa sayısal bir kimlik (PB3874) eklemeyi denediğimde, bu uygulama düzgün bir şekilde kapatıldığında çalışır.

Hata:

private static final String DATABASE_CREATE = 
    "create table usertable (_id integer primary key autoincrement, " 
    + "studid text not null);"; 

Ama hata no such column: pb3874 söylediğini neden karıştı: (ı metin türünü kullandığından)

06-13 18:22:20.554: ERROR/AndroidRuntime(8088): android.database.sqlite.SQLiteException: no such column: pb3874: , while compiling: select count(*) from usertable where studid=pb3874

Ben onun veri türü sorununu sanmıyorum Ben sadece studid sütunundan bu değeri seçmeye çalışıyorum. Ve ayrıca bu neden herhangi bir int değeri için mükemmel çalışıyor. Herhangi bir sorun çözme konusunda herhangi bir sorun var mı?

+0

Olası kopyalar [SQLite insert sorunu - Hata: Böyle sütun] (https://stackoverflow.com/questions/21958789/sqlite-insert-issue-error-no-such-column) – Veve

cevap

53

Burada olan şey, SQLite 'pb3874' aslında bir dize/metin literalden ziyade bir sütun adı olduğunu düşünüyor.

Eğer metin değeri uygun tek tırnak sarılı sağlamak isteyeceksiniz, bir metin edebi olduğunu belirtmek için:

SQL enjeksiyon saldırıları önlemek için, kullanıcıdan girdi alıyoruz zaman, kullanım bir parametreli sorgu: (kullanıcı girişi çekerken çok cesaretini) parameterization olmadan

("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

:

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null); 

nedeni, sayısal val ues bunu yapmadı: SQLite sizin için bu sayısal değişmezleri dönüştürdü.

+1

Teşekkürler, cevabınız benim için bir sorunu gidermede yardımcı oldu. Dize için tek tırnak dahil etmeyi unutmayın ve aynı SQLiteException'ı aldım. – webgenius

+0

@webgenius, bu gerçekten yararlı bir cevaptı.Teşekkürler –

+0

@ p.campbell Çok teşekkürler – PN10

5

SQL dizesine ekliyorsanız, 'pb3874' (tek tırnak) belirtmeniz gerekir.

2

Ben sen, sen bunu böyle yap, ben öneririm, doğru sorguyu biçimlendirmek için Antlersoft veya p.campbell gelen sorunun ne kadar cevap var düşünüyorum:

mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

(1) çözmek gerekir O senin sorun ve (2) SQL yerleştirme

Ayrıca

sizi korumak, ben

dataCount.getInt(0); 

... muhtemelen için getColumnIndex kullanmalıdır yapılacak en iyi şey olduğunu değil emin değilim STRING için

+0

+1 kabul etti.Sağol Matt. Bu sayfaya uyacak gelecekteki Android SQLite ziyaretçilerinin SQL enjeksiyonunun önlenmesini sağlayacağını umuyoruz. Teşekkürler! –

0

sen '('sasas')' arasındaki yerleştirmek gerekir ..., doğru verileri aldığından emin olmak

select * from bio where email = 'sasas' 
ait
İlgili konular