web-dev-qa-db-fra.com

SQLite Exception aucune colonne de ce type lorsque vous essayez de sélectionner

J'ai la classe d'assistance DB suivante:

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;
}

J'utilise cela dans mon application pour voir si un identifiant d'étudiant a déjà été entré.

Cela fonctionne bien lorsque les identifiants d'étudiant sont ints (346742), mais chaque fois que j'essaie d'ajouter un identifiant alphanumérique (PB3874), il ferme l'application.

Erreur:

06-13 18: 22: 20.554: ERREUR/AndroidRuntime (8088): Android.database.sqlite.SQLiteException: aucune colonne de ce type: pb3874:, lors de la compilation: sélectionnez le nombre (*) à partir de la table usable où studid = pb3874

Je ne pense pas que ce soit un problème de type de données (parce que j'utilise le type de texte):

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

Mais je ne comprends pas pourquoi l'erreur indique no such column: pb3874 car j'essaie simplement de sélectionner cette valeur dans la colonne studid. Et aussi pourquoi cela fonctionne parfaitement pour toute valeur int. Quelqu'un a un conseil de résolution de problème?

26
bMon

Ce qui se passe ici, c'est que SQLite pense que "pb3874" est en réalité un nom de colonne, plutôt qu'un littéral chaîne/texte.

Pour spécifier qu'il s'agit d'un littéral de texte, vous devez vous assurer que votre valeur de texte est encadrée par les guillemets simples appropriés:

Pour empêcher les attaques par injection SQL, utilisez une requête paramétrée chaque fois que vous prenez des entrées de l'utilisateur:

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

Sans paramétrage (très déconseillé lors de la saisie de l'utilisateur):

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

La raison pour laquelle vos valeurs numériques n'ont pas produit ceci: SQLite a converti ces littéraux numériques pour vous.

62
p.campbell

Vous devez citer 'pb3874' (guillemets simples) si vous l'incluez dans la chaîne SQL.

6
antlersoft

Je pense que vous avez obtenu la réponse de Antlersoft ou de p.campbell à la formulation correcte de la requête, comme suit:

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

Cela devrait (1) résoudre votre problème et (2) vous protéger contre les injections SQL

Aussi, je ne suis pas sûr que 

dataCount.getInt(0);

est la meilleure chose à faire ... vous devriez probablement utiliser getColumnIndex pour vous assurer d'obtenir les bonnes données ...

2
Matthieu

pour STRING, placez-le entre '' ('sasas')

select * from bio where email = 'sasas'
0
saigopi