0

在datagridview中,我有一个复选框列,选中复选框的行应该在我单击按钮时从datagridview以及数据库中删除delete,我正在使用此代码来执行此功能,使用此代码我能够从datagidview中删除行,但是在从数据库中删除它时,我Data type mismatch in criteria expression.在这行代码之后出现了这个异常cmd.ExecuteNonQuery(); ,我出错了,我应该做些什么更正才能让这个工作

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

提前感谢您的帮助

4

2 回答 2

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();
}
于 2013-07-30T17:45:13.117 回答
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();
于 2013-07-30T17:48:48.600 回答