首先,如果格式不好,我很抱歉,我是新手。
好吧,我最近开始学习 C#,以便编写本地数据库软件。现在我正在使用的书上有一章是关于这个的,但是在SQL注入预防方面出现了问题。我在 Visual Studio 和 MS Access 中使用 C# 和 OleDB 包。
现在,当我一开始使用某种方法时,什么也没有发生(一切正常)。但我之后使用的下一个查询给出了以下错误消息:
无法使用与其底层 RCW 分离的 COM 对象
这只在使用参数化 SQL 查询时才会发生。
所以这段代码是在点击按钮后执行的。它从文本框中获取一个字符串并将其放入 SQL 命令参数中。更新表方法执行命令并更新窗口中的表。我在命令中添加参数后出现错误。
private void CmdSearchName_Click(object sender, EventArgs e)
{
cmd.CommandText = "SELECT * FROM contacts WHERE name LIKE ?";
cmd.Parameters.Add("", OleDbType.VarChar).Value = txtInput.Text;
UpdateTable();
cmd.Parameters.Clear();
}
现在如上所述,我第一次运行它时它可以工作。再次运行会抛出错误。第三次运行,它再次起作用,而第四次则不起作用。就这样继续下去。
如果需要更多信息,请询问。感谢您的帮助。
如果你要更新表,那么你需要更新哪一行 id,你的代码将如下所示:
using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB))
{
string strSQL = "UPDATE contacts SET [name] = @Name WHERE ID = @id";
using (OleDbCommand cmd = new OleDbCommand(strSQL, conn))
{
cmd.Parameters.Add("@Name", OleDbType.VarWChar).Value = textInput.Text;
cmd.Parameters.Add("@id", OleDbType.Integer).Value = 124;
conn.Open();
cmd.ExecuteNonQuery();
}
}
所以,要更新数据,需要使用更新命令。并且您需要提供一个“id”,否则更新命令将更新数据库中的所有行。
作为“也以防万一”,我在“名称”列两边加上方括号,因为它是保留字。
我对 1234 的 id 使用了“虚构”值,您可以将该 ID 替换为正确的 id 值,以更新“一个”正确行。
我还会注意到,虽然我使用了@Name 和@id 等命名参数?
使用 Access 作为数据库时添加此类参数的顺序很重要。