【发布时间】: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);
但这会引发InvalidCastException 说The OleDbParameterCollection only accepts non-null OleDbParameter type objects, not String objects.
谁能引导我了解将任何类型的字符串插入 Access 数据库而不会由于对 SQL 解释器具有“特殊”含义的字符而导致 SQL 命令失败的最佳实践是什么?
【问题讨论】:
-
注意:如果字符串不包含任何特殊字符,代码可以正常工作。