转义MS Access查询的特殊字符

时间:2011-09-21 14:16:26

标签: c# sql regex ms-access jet

我想通过ms访问数据库的插入查询存储这些字符“'^ +%& /()=?_”。我如何做到这一点,并防止每一个案件?

4 个答案:

答案 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)

在Visual Studio上

您必须将单个字符转换为双字符

即:

sql = replace(sql, "'", "''");