2013-07-30 102 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