我想存储这些字符" '^+%&/()=?通过对ms access数据库的插入查询。我如何做到这一点,防止每一种情况?
使用参数化的INSERT
语句
看起来你的代码正在组装SQL命令字符串。我必须告诉你:如果是这样的话,它会使你的代码容易受到SQL注入的攻击。
除了使用参数化查询(参见Adrian's Answer)之外,您还可以使用带有参数的查询定义并调用它
例如,您可以使用以下sql
创建一个名为qry_InsSomeTable的查询PARAMETERS P_SomeField Text ( 255 );
INSERT INTO tbl_SomeTable ( P_SomeField )
VALUES (P_SomeField );
然后你可以像调用任何存储过程一样调用
using(var cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:Whatever.mdb")
{
var cmd = new OleDbCommand();
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = cmd.CommandText = "qry_InsSomeTable";
cmd.Parameters.AddWithValue("P_SomeField", "'^+%&/()=?_ ");
cn.Open();
cmd.ExecuteNonQuery();
}
当你的表中有很多字段
时,它特别有用例如
cmd.CommandText = @"Insert Into TableWithAlotofFields
(field1, field2, field3, field4, field5,...)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?..)";
cmd.Parameters.Add("value1");
cmd.Parameters.Add("value2");
cmd.Parameters.Add("value3");
cmd.Parameters.Add("value4");
cmd.Parameters.Add("value5");
vs。
查询已经在Access中定义为
PARAMETERS P_field1Text Text ( 255 ), P_field2 Number, P_field3 text(15), ...;
Insert Into TableWithAlotofFields
(field1, field2, field3, field4, field5,...)
VALUES(P_field1, P_field2, P_field3, P_field4, P_field5,...)
cmd.CommandText = cmd.CommandText = "qry_InsSomeTable";
cmd.Parameters.AddWithValue("P_field1", "value1");
cmd.Parameters.AddWithValue("P_field2", "value2");
cmd.Parameters.AddWithValue("P_field3", "value3");
cmd.Parameters.AddWithValue("P_field4", "value4");
cmd.Parameters.AddWithValue("P_field5", "value5");
然而,正如@David-W-Fenton指出的那样,参数上的名称被忽略,只考虑位置。例如
cmd.Parameters.AddWithValue("P_field1", "value1");
cmd.Parameters.AddWithValue("P_field2", "value2");
不等于
cmd.Parameters.AddWithValue("P_field2", "value2");
cmd.Parameters.AddWithValue("P_field1", "value1");
所以看起来主要是文体上的差异
要插入特殊字符,必须将特殊字符括在方括号([])中。我希望这对你有帮助。
在Visual Studio中,您必须将单个字符转换为双字符
即:
sql = replace(sql, "'", "''");