正在从数据库和数据网格视图中删除行
本文关键字:网格 视图 删除行 数据网 数据 数据库 | 更新日期: 2023-09-27 18:25:29
在datagridview中,我有一个复选框列,当我单击delete
按钮时,复选框所在的行应该从datagridview和数据库中删除,我正在使用此代码来执行此功能,使用此代码我可以从datagidview中删除行,但是当从数据库中删除它时,我在这行代码cmd.ExecuteNonQuery();
之后得到了这个异常Data type mismatch in criteria expression.
我哪里出了问题,我应该做什么纠正才能得到这个有效的
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);
}
提前感谢的任何帮助
从您的代码
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();
}
最好的方法是使用Parameters构建OleDbCommand。
OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM Questions WHERE QID = @QID", acccon);
oleDbCommand.Parameters.Add("@QID",OleDbType.Integer).Value = j;
oleDbCommand.Prepare();
oleDbCommand.ExecuteNonQuery();