2013-07-30 103 views
0

在datagridview中,我有一個複選框列,其中複選框被選中的行應該從datagridview以及從數據庫中刪除,當我點擊delete按鈕時,我正在使用這個代碼做這個功能,使用此代碼我能夠從datagidview中刪除行,但從數據庫中刪除它時,我得到此異常Data type mismatch in criteria expression.此行代碼cmd.ExecuteNonQuery(); 我在哪裏出錯了,應該做什麼修正我得到這個工作從數據庫和datagridview刪除行

private void button1_Click(object sender, EventArgs e) 
{ 

     List<int> ChkedRow=new List<int>(); 
     DataRow dr; 
     List<int> ChkedRowQid=new List<int>(); 

     for (int i = 0; i <= dataGridView1.RowCount - 1; i++) 
     { 
     if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["select"].Value) == true) 
     { 
      ChkedRow.Add(i); 
      ChkedRowQid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["QID"].Value)); 

     } 
     } 

     foreach (int k in ChkedRow) 
     { 
     dr = dt.Rows[k]; 
     dt.Rows[k].Delete(); 
      foreach(int j in ChkedRowQid) 
      { 
       bool flag=false; 
      try 
      { 
       string sql = "DELETE FROM Questions WHERE QID='" + j + "' "; 
       OleDbCommand cmd = new OleDbCommand(sql,acccon); 
       cmd.ExecuteNonQuery(); 
       flag = true; 
      } 
      catch(Exception err) 
      { 

      } 

      } 

     //dt.Rows.Remove(dr); 
     } 

在此先感謝您的幫助

+0

在你的數據庫中,QID是一個字符串還是某種類型的整數? – Vahlkron

+0

因爲我使用Microsoft Access所以QID是文本類型的整數 – Durga

回答

1

從您的代碼

Convert.ToInt16(dataGridView1.Rows[i].Cells["QID"].Value) 

我能猜到你的QID是,而你是把它當作一個字符串的整數。你不需要單引號。

string sql = "DELETE FROM Questions WHERE QID=" + j ; 

應該是好的。

編輯

雖然這應該爲你工作,但是這是不是因爲你很容易受到SQLInjection推薦的做法。您應該使用參數化查詢來針對您的數據庫運行任何腳本。例如

using(OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connString)) 
{ 
conn.Open(); 
string query= "DELETE FROM Questions WHERE QID = @pID"; 
OleDbCommand comamnd = new OleDbCommand(query, conn); 
comamnd.Parameters.Add("@pID",OleDbType.Integer).Value = j; 
comamnd.CommandType = CommandType.Text; 
command.ExecuteNonQuery(); 
conn.Close(); 
} 
+0

沒有仍然不工作 – Durga

+0

@Durga什麼是錯誤?還是一樣?或者根本不刪除? – Ehsan

+0

是的它正在工作Thanku sooo多 – Durga

0

最好是用參數建立OleDbCommand。

OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM Questions WHERE QID = @QID", acccon); 
oleDbCommand.Parameters.Add("@QID",OleDbType.Integer).Value = j; 
oleDbCommand.Prepare(); 
oleDbCommand.ExecuteNonQuery(); 
+0

它給了我例外'Prepare:連接屬性尚未初始化.'在這一行'oleDbCommand.Prepare();'我該如何糾正它? – Durga

+0

將連接傳遞給OleDbCommand,我將更新我的示例。 –

+0

是的,這是工作感謝 – Durga