2014-06-26 23 views
0

這很簡單,但我看不出錯在哪裏!該參數未添加到查詢中。這裏是我的代碼:C# - SQLite提供給命令錯誤的參數不足

SQLiteDB db; 
db = new SQLiteDB(Config.getMasterUsersDB()); 
DataTable masterUsers; 
SQLiteCommand query = new SQLiteCommand("SELECT username , password , localDB FROM master_users WHERE username = @username"); 
query.Parameters.Add("@username", comboMasterUsers.SelectedItem.ToString()); 
masterUsers = db.GetDataTable(query.CommandText); 

foreach (DataRow r in masterUsers.Rows) 
{ 
    if (txtPassword.Text == r["password"].ToString()) 
    { 
      Config.setLocalDB(r["localDB"].ToString()); 
      Config.setLoggedMasterUser(r["username"].ToString()); 

      this.Hide(); 
      formMain formMain = new formMain(); 
      formMain.Show(); 
    } 
} 

SQLiteDB是一個輔助類,使數據庫連接和檢索

public DataTable GetDataTable(string sql) 
    { 
     DataTable dt = new DataTable(); 
     try 
     { 
      SQLiteConnection cnn = new SQLiteConnection(dbConnection); 
      cnn.Open(); 
      SQLiteCommand mycommand = new SQLiteCommand(cnn); 
      mycommand.CommandText = sql; 
      SQLiteDataReader reader = mycommand.ExecuteReader(); 
      dt.Load(reader); 
      reader.Close(); 
      cnn.Close(); 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message); 
     } 
     return dt; 
    } 

,爲什麼我會提供給命令錯誤的參數不足?我也看不到任何錯別字。

回答

0

要添加的參數到第一命令對象(query),但是然後創建一個對象(mycommand)沒有任何參數。

你必須改變GetDataTable的參數添加到自己的對象:

... 
    string sql = "SELECT ... WHERE username = ?"; 
    db.GetDataTable(sql, comboMasterUsers.SelectedItem.ToString()); 
    ... 

public DataTable GetDataTable(string sql, params Object[] parameters) 
{ 
    ... 
    mycommand.CommandText = sql; 
    foreach (var value in parameters) 
    { 
     var param = mycommand.CreateParameter(); 
     param.Value = value; 
     mycommand.Parameters.Add(param); 
    } 
    ... 
+0

謝謝你,偉大的答案。所以這些參數不會被添加到commandText中?我認爲它是這樣做的,所以我然後將commandText發送到GetDataTable。 – JackM36

+0

參數繞過任何解析並分別傳遞到數據庫(否​​則,blob將不起作用)。 –

相關問題