SQL 参数化查询的 C# 和 OleDB 错误

问题描述 投票:0回答:1

首先,如果格式不好,我很抱歉,我是新手。

好吧,我最近开始学习 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();
}

现在如上所述,我第一次运行它时它可以工作。再次运行会抛出错误。第三次运行,它再次起作用,而第四次则不起作用。就这样继续下去。

如果需要更多信息,请询问。感谢您的帮助。

c# database ms-access oledb
1个回答
0
投票

如果你要更新表,那么你需要更新哪一行 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 作为数据库时添加此类参数的顺序很重要。

© www.soinside.com 2019 - 2024. All rights reserved.