2

我正在尝试注销执行的 sql。

我有一个调用 LogGenerateReport(String Sql) 的函数,它将执行插入过程以将数据保存在数据库中。

我面临的问题是关于 SQl ''。

例如:

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = 'ABC123';')

它返回给我错误,我知道由于引用而发生了什么。我再次尝试在我的数据库中打开一个新查询并粘贴到 sql 上方并对其进行一些修改,例如。

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = ''' + 'ABC123' + ''';')

它返回我预期的结果。

 Output:
|Sql                                          |
|SELECT * FROM Sales WHERE SalesID = 'ABC123';|

但是回到我的 .aspx.cs 页面,我有一个字符串生成器,用于存储执行的查询,在执行之前,它需要先保存查询。

For example:

System.Text.StringBuilder str = new System.Text.StringBuilder();
str.append("SELECT * FROM Sales WHERE SalesID = 'ABC123';");

api.LogGenerateReport(Convert.tostring(str));

由于引用,它像上面一样返回错误。

我试图解决这个问题,我的想法是

String TempSql = Convert.tostring(str);
TempSql.Replace("'","+'''");

我不会工作,因为 + 符号在不同的位置。

有什么办法可以克服这个吗?

4

4 回答 4

3
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"SELECT * FROM Sales WHERE SalesID = @Param";
cmd.Parameters.Add("@Param", SqlDbType.Varchar).Value = 'ABC';

试试这个,强烈推荐使用参数化的,并且在某种程度上处理 sql 注入以及这些类型的问题

于 2013-01-18T04:39:17.710 回答
3

要成功记录任何和所有 SQL 查询(无论其内容如何),您需要按以下方式应用参数化命令:

using(var command = new SqlCommand(someSqlConnection))
{
   command.CommandText = "INSERT INTO TABLE(Sql) VALUE(@Sql)";
   command.Parameters.AddWithValue("@Sql", "<any string>");
   command.ExecuteNonQuery();
}

这样您就可以避免使用非标准方法转义任何内容,并保护您的代码免受 SQL 注入攻击。

于 2013-01-18T04:49:40.780 回答
0

为什么不能用双单引号替换语句中的所有单引号?此请求工作正常:

INSERT INTO TABLE(Sql)
VALUE('SELECT * FROM Sales WHERE SalesID = ''ABC123'';')

和代码:

String TempSql = Convert.tostring(str);
TempSql.Replace("'","''");
于 2013-01-18T04:43:45.217 回答
0

我的猜测是您的 api.LogGenerateReport 在将行插入数据库时​​没有转义单引号。您应该使用参数修复您的插入语句。

要使其按原样“工作”,您需要用两个单引号转义单引号。尝试改变:

"SELECT * FROM Sales WHERE SalesID = 'ABC123';"

"SELECT * FROM Sales WHERE SalesID = ''ABC123'';" <-- these are 2 single quotes, no double quotes

祝你好运。

于 2013-01-18T04:43:54.280 回答