我想通过ms访问数据库的插入查询存储这些字符“'^ +%& /()=?_”。我如何做到这一点,并防止每一个案件?
答案 0 :(得分:2)
使用parameterized INSERT
声明。
看起来您的代码正在组装SQL命令字符串。我必须告诉您:如果是这种情况,则会使您的代码容易受到SQL Injection的攻击。</ p>
答案 1 :(得分:1)
除了使用参数化查询(请参阅Adrian的答案),您还可以使用带参数的查询定义并调用它。
例如,您可以使用以下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,...)
然后在c#
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");
因此,差异似乎主要是风格。
答案 2 :(得分:0)
要插入特殊字符,您应将特殊字符括在括号([])中。我希望这有帮助。
答案 3 :(得分:0)
您必须将单个字符转换为双字符
即:
sql = replace(sql, "'", "''");