Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库和datagridview中删除行_C#_Datagridview_Datarow - Fatal编程技术网

C# 从数据库和datagridview中删除行

C# 从数据库和datagridview中删除行,c#,datagridview,datarow,C#,Datagridview,Datarow,在datagridview中,我有一个复选框列,选中复选框的行应该从datagridview以及数据库中删除。当我单击delete按钮时,我使用此代码来完成此功能,使用此代码我可以从datagridview中删除行,但当从数据库中删除它时,我在条件表达式中得到了这个异常数据类型不匹配。在这行代码之后cmd.ExecuteNonQuery() 如果我出了问题,我应该做些什么来纠正,这样我就可以工作了 private void button1_Click(object sender, EventAr

在datagridview中,我有一个复选框列,选中复选框的行应该从datagridview以及数据库中删除。当我单击
delete
按钮时,我使用此代码来完成此功能,使用此代码我可以从datagridview中删除行,但当从数据库中删除它时,我在条件表达式中得到了这个异常
数据类型不匹配。
在这行代码之后
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);
        }
private void按钮1\u单击(对象发送者,事件参数e)
{
List ChkedRow=新列表();
数据行dr;
List ChkedRowQid=新列表();
对于代码中的(int i=0;i)

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

最好是使用参数构建OLEDB命令

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

在您的数据库中,QID是字符串还是某种类型的整数?因为我使用的是Microsoft Access,所以QID是文本类型的integer@Durga错误是什么?仍然相同?或者只是没有删除?@Durga很高兴它能工作。但我建议您使用参数化查询。因为您当前的代码易受SqlInjectionParameterized方法的攻击,如
Martijn van Put的回答是这样的?是的,这就是正确的方法。它给了我异常
Prepare:Connection属性尚未初始化。
在这一行
oleDbCommand.Prepare();
我如何更正它?将连接传递到oleDbCommand,我将更新我的示例。