2009-04-15 3 views
8

У меня есть следующий код:System.Data.SQLite вопрос параметра

try 
{ 
    //Create connection 
    SQLiteConnection conn = DBConnection.OpenDB(); 

    //Verify user input, normally you give dbType a size, but Text is an exception 
    var uNavnParam = new SQLiteParameter("@uNavnParam", SqlDbType.Text) { Value = uNavn }; 
    var bNavnParam = new SQLiteParameter("@bNavnParam", SqlDbType.Text) { Value = bNavn }; 
    var passwdParam = new SQLiteParameter("@passwdParam", SqlDbType.Text) {Value = passwd}; 
    var pc_idParam = new SQLiteParameter("@pc_idParam", SqlDbType.TinyInt) { Value = pc_id }; 
    var noterParam = new SQLiteParameter("@noterParam", SqlDbType.Text) { Value = noter }; 
    var licens_idParam = new SQLiteParameter("@licens_idParam", SqlDbType.TinyInt) { Value = licens_id }; 

    var insertSQL = new SQLiteCommand("INSERT INTO Brugere (navn, brugernavn, password, pc_id, noter, licens_id)" + 
    "VALUES ('@uNameParam', '@bNavnParam', '@passwdParam', '@pc_idParam', '@noterParam', '@licens_idParam')", conn); 
    insertSQL.Parameters.Add(uNavnParam); //replace paramenter with verified userinput 
    insertSQL.Parameters.Add(bNavnParam); 
    insertSQL.Parameters.Add(passwdParam); 
    insertSQL.Parameters.Add(pc_idParam); 
    insertSQL.Parameters.Add(noterParam); 
    insertSQL.Parameters.Add(licens_idParam); 
    insertSQL.ExecuteNonQuery(); //Execute query 

    //Close connection 
    DBConnection.CloseDB(conn); 

    //Let the user know that it was changed succesfully 
    this.Text = "Succes! Changed!"; 
} 
catch(SQLiteException e) 
{ 
    //Catch error 
    MessageBox.Show(e.ToString(), "ALARM"); 
} 

Он выполняет отлично, но когда я рассматриваю свой «brugere» стол, он вставил значение: «@uNameParam», «@ bNavnParam ',' @passwdParam ',' @pc_idParam ',' @noterParam ',' @licens_idParam 'буквально. Вместо замены их.

Я попытался сделать точку останова и проверить параметры, они имеют правильные назначенные значения. Так что это тоже не проблема.

Я уже много раз занимаюсь этим, не повезло, может ли кто-нибудь помочь?

Ну и для справки, вот метод OpenDB из класса DBConnection:

public static SQLiteConnection OpenDB() 
{ 
    try 
    { 
     //Gets connectionstring from app.config 
     const string myConnectString = "data source=data;"; 

     var conn = new SQLiteConnection(myConnectString); 
     conn.Open(); 
     return conn; 
    } 

    catch (SQLiteException e) 
    { 
     MessageBox.Show(e.ToString(), "ALARM"); 
     return null; 
    } 
} 

ответ

29

Вы должны удалить кавычки ваших имен параметров в операторе INSERT.

Таким образом, вместо

VALUES ('@uNameParam', '@bNavnParam', '@passwdParam', '@pc_idParam', 
     '@noterParam', '@licens_idParam') 

использование

VALUES (@uNameParam, @bNavnParam, @passwdParam, @pc_idParam, 
     @noterParam, @licens_idParam) 
+0

Простите, нет, я тоже это пробовал. Это приведет к следующей ошибке: «Недостаточно параметров, предоставленных команде» – CasperT

+0

А, я вижу вашу проблему. Не все имена параметров одинаковы: @uNavnParam и @uNameParam. Это простая опечатка :) –

+0

И вы все равно должны удалить одиночные кавычки вокруг своих параметров. –

2

Благодаря rwwilden и Хорхе Villuendas, ответ:

var insertSQL = new SQLiteCommand("INSERT INTO Brugere (navn, brugernavn, password, pc_id, noter, licens_id)" + 
" VALUES (@uNavnParam, @bNavnParam, @passwdParam, @pc_idParam, @noterParam, @licens_idParam)", conn); 
insertSQL.Parameters.AddWithValue("@uNavnParam", uNavn); 
insertSQL.Parameters.AddWithValue("@bNavnParam", bNavn); 
insertSQL.Parameters.AddWithValue("@passwdParam", passwd); 
insertSQL.Parameters.AddWithValue("@pc_idParam", pc_id); 
insertSQL.Parameters.AddWithValue("@noterParam", noter); 
insertSQL.Parameters.AddWithValue("@licens_idParam", licens_id); 

insertSQL.ExecuteNonQuery(); //Execute query 
0

заменить

VALUES ('@uNameParam', '@bNavnParam', '@passwdParam', '@pc_idParam', '@noterParam', '@licens_idParam')

с

VALUES (?, ?, ?, ?, ?, ?)

1

При использовании System.Data.SqlClient тогда вы предоставляете тип параметров из System.Data.SqlDbType перечисления.

Но если вы используете System.Data.SQLite, то вы должны использовать **System.Data.DbType** перечисления.