2009-04-15 9 views
8

Mam następujący kod:System.Data.SQLite problem parametr

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

Wykonuje doskonale, ale kiedy zobaczyć moje „Brugere” tabeli, ma wstawione wartości: „@uNameParam”, „@ bNavnParam ',' @passwdParam ',' @pc_idParam ',' @noterParam ',' @licens_idParam 'dosłownie. Zamiast ich zastępować.

Próbowałem dokonać breakpoint i sprawdzone parametry, mają one poprawne przypisane wartości. Więc to też nie jest problem.

Poświęcam temu dużo teraz, bez powodzenia, czy ktoś może pomóc?

Oh i dla odniesienia, tutaj jest metoda OpenDB z klasy 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; 
    } 
} 

Odpowiedz

29

Należy usunąć cudzysłowy wokół nazwy parametrów w instrukcji INSERT.

Więc zamiast

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

użycie

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

Przepraszam, nie, spróbowałem też. Wystąpiłby następujący błąd: "Niewystarczające parametry dostarczone do polecenia" – CasperT

+0

Ah, widzę twój problem. Nie wszystkie nazwy parametrów są takie same: @uNavnParam kontra @uNameParam. To prosta literówka :) –

+0

Powinieneś nadal usuwać pojedyncze cudzysłowy wokół swoich parametrów. –

2

Dzięki rwwilden Jorge Villuendas, odpowiedź brzmi:

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

zastąpić

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

z

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

1

Podczas korzystania System.Data.SqlClient następnie podać typy parametrów z System.Data.SqlDbType wyliczenie.

Ale jeśli używasz System.Data.SQLite następnie trzeba użyć **System.Data.DbType** wyliczenie.

Powiązane problemy