【问题标题】:Inserting special chars (such as ' or +) into an Access database将特殊字符(例如 ' 或 +)插入 Access 数据库
【发布时间】:2015-03-15 14:17:23
【问题描述】:

我在 SQL、Access 或 C# 方面没有太多经验,但对于一个对于具有更多专业知识的人来说应该看起来很简单的问题,我没有找到解决方案。

基本上,用户在 Winform 中填写一些文本框,他可能会插入一些“特殊”字符(至少,对于 DB 字符串来说是特殊的),例如 '。因此,这些数据通过OleDb 连接传输到数据库中;假设string myString = this.textBox1.Text 是我想插入到表myTable 的字段MY_FIELD 中的值。

起始代码

我的起始代码很简单:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + this.DBstring);
OleDbCommand comm = new OleDbCommand();
comm.CommandText = "INSERT INTO myTable (MY_FIELD) VALUES ('" + myString + "')";
comm.CommandType = CommandType.Text;
comm.Connection = conn;
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

myString 类似于guns'n'roses 的情况下,上面的代码很容易失败,因为comm.CommandText 将是以下无效SQL 的字符串值:INSERT INTO myTable(MY_FIELD) VALUES ('guns'n'roses')

进一步研究

我显然不是第一个遇到这种问题的新手。所以我通过 Stack Overflow 搜索了一下,发现了以下thread,其中一个人在将括号插入命令字符串时遇到了问题。因此,我尝试根据接受的答案调整我的代码:

comm.CommandText = "INSERT INTO myTable (MY_FIELD) VALUES (?)";
comm.Parameters.Add(myString);

但这会引发InvalidCastExceptionThe OleDbParameterCollection only accepts non-null OleDbParameter type objects, not String objects.

谁能引导我了解将任何类型的字符串插入 Access 数据库而不会由于对 SQL 解释器具有“特殊”含义的字符而导致 SQL 命令失败的最佳实践是什么?

【问题讨论】:

标签: c# sql ms-access oledb


【解决方案1】:

您对此使用 OleDbParameter 是正确的。每次要将值传递给数据库引擎时,都应该使用参数。第二次尝试的唯一问题是您没有使用正确的语法来创建参数并将其添加到命令集合中

comm.CommandText = "INSERT INTO myTable (MY_FIELD) VALUES (?)";
comm.Parameters.Add("@name", OleDbType.VarWChar).Value = myString;

当然,如果您的 MY_FIELD 是一个文本字段,如果它是数字,那么您需要使用适当的 OleDbType 枚举。

说我会建议把你的代码改成这个例子

string cmdText = "INSERT INTO myTable (MY_FIELD) VALUES (?)";
using(OleDbConnection conn = new OleDbConnection(....))
using(OleDbCommand comm = new OleDbCommand(cmdText, conn))
{
     conn.Open();
     comm.Parameters.Add("@name", OleDbType.VarWChar).Value = myString;
     comm.ExecuteNonQuery();
}

主要区别在于Using Statement。使用此语法,您的一次性对象(连接和命令)在您完成使用它们释放任何使用的系统资源后正确关闭和处置。在例外情况下也会发生这种情况

【讨论】:

  • 谢谢一百万,史蒂夫。我的代码现在正在等着我进行一次大的重构,但它绝对值得这样做:)
  • 你好史蒂夫,你介意看看我在here发布的这个问题吗?在此先感谢:)
【解决方案2】:

OleDbParameterCollection 的.Add 方法有几个重载,只有一个参数的方法期望该参数是一个 OleDbParameter 对象

如果要传递参数的字符串 ,则需要使用接受参数名称、类型和列宽的重载,即this one,然后分配.Value,如下所示:

comm.Parameters.Add("?", OleDbType.VarWChar, 255).Value = myString;

而且,正如@Steve 所说,您应该始终使用参数而不是“动态 SQL”(这是您第一次尝试将值“粘合”到 SQL 语句本身中)。

【讨论】:

  • 非常感谢您的帮助 Gord,我终于接受了史蒂夫的回答,因为它与您的回答大致相同 + 关于 using 的好提示。感谢两位的宝贵帮助!
猜你喜欢
  • 2021-03-27
  • 2011-02-04
  • 2012-03-24
  • 2020-08-30
  • 2018-02-26
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多