2009-12-03 6 views
0

Le code suivant fonctionne parfaitement:SQLite ADO .NET - comment utiliser correctement le générateur de requêtes?

var oDb = new SQLiteConnection(); 
    oDb.ConnectionString = String.Format(
     "Data Source={0};" 
    + "Synchronous=Full;", 
    "test.db"); 
    oDb.Open(); 
    SQLiteCommand oCmd = new SQLiteCommand(oDb); 
    oCmd.CommandText = "create table tests ("; 
    oCmd.CommandText += " id guid primary key not null"; 
    oCmd.CommandText += ", name text default 'none')"; 
    oCmd.ExecuteNonQuery(); 

Mais si je tente d'utiliser un générateur de requêtes (pour échapper automatiquement les chaînes):

var oDb = new SQLiteConnection(); 
    oDb.ConnectionString = String.Format(
     "Data Source={0};" 
    + "Synchronous=Full;", 
    "test.db"); 
    oDb.Open(); 
    SQLiteCommand oCmd = new SQLiteCommand(oDb); 
    oCmd.CommandText = "create table tests ("; 
    oCmd.CommandText += " id guid primary key not null"; 
    oCmd.CommandText += ", name text default @param)"; 
    var oParam = new SQLiteParameter("@param", "none"); 
    oCmd.Parameters.Add(oParam); 
    oCmd.ExecuteNonQuery(); 

exception est levée:

SQLite error 
near "@param": syntax error 

Can quelqu'un s'il vous plaît épargner un peu de connaissance et me fait signe ce que je fais mal?

Répondre

2

Bien que je ne l'ai pas testé moi, cela devrait fonctionner: oCmd.Parameters.AddWithValue("@param", "none"); Edit: cela fonctionne si vous ajoutez() autour du @param:

Edit2: Eh bien, la ExecuteNonQuery() ne travail, mais le résultat n'est pas le résultat attendu. @param ne sera pas remplacé par le paramètre acutal. N'utilisez pas ce code! (Maintenant un wiki communautaire. Peut-être que quelqu'un est capable de le réparer?)

SQLiteCommand oCmd = new SQLiteCommand(oDb); 
oCmd.CommandText = "create table tests ("; 
oCmd.CommandText += " id guid primary key not null"; 
oCmd.CommandText += ", name text default (@param))"; 
var oParam = new SQLiteParameter("@param", "none"); 
oCmd.Parameters.Add(oParam); 
oCmd.ExecuteNonQuery(); 
+0

exactement la même exception :( – grigoryvp

+0

j'ai changé ma réponse à une version de travail. Cependant, je ne sais pas vraiment pourquoi les() doivent être présent: http://www.sqlite.org/syntaxdiagrams.html#column-constraint indique qu'il peut y avoir aussi un littéral sans les parenthèses ... – tobsen

+1

Je suis surpris que cela fonctionne, je ne vous connaissais pas pourrait utiliser la liaison de paramètres avec des instructions de langage de définition de données – tuinstoel

Questions connexes