如何使用C#转义SQL的html字符串

时间:2017-12-20 12:20:07

标签: c#

我正在尝试使用C#生成SQL,但是它无法在服务器上执行。字符串中有html输入导致语法错误。

我曾尝试将单引号(')替换为两次(''),但也因为少数输入而失败,例如(\\\\'')

错误示例:

实际输入字符串

  

'紧凑的设计,信号稳定'

修改后的SQL输入字符串

  

'紧凑的设计,信号稳定'

错误的SQL

  

更新产品SET LongDescription ='它紧凑的设计与   稳定信号&#39 ;;

    private static void makeSQLThread(List<Product> products, ref List<string> sqlList)
    {
        foreach (var item in products)
        {
            var colorId = item.ColorId;
            var description = item.Description.Replace("'", "''"); // html input
            var longDescription = item.LongDescription.Replace("'", "''"); // long html input
            var isAvailable = item.isAvailable ? 1 : 0;

            var formatSQl = string.Format("UPDATE products SET ColorId = {0}, Description = '{1}', LongDescription = '{2}', isAvailable = {3} WHERE Id = {4};",
              colorId, description, longDescription, isAvailable, item.Id);

            Console.WriteLine(formatSQl);

            sqlList.Add(formatSQl);
        }
    }

我将所有这些查询保存在文本文件中并在服务器上执行。我怎样才能以安全和更好的方式做到这一点。我现在不能像SQLCommand等那样使用C#命令。

由于

1 个答案:

答案 0 :(得分:0)

如果您要按批处理方式进行批处理更新,那么按照计划的方式进行操作比使用SQL参数要好得多。多次往返服务器非常慢。最近,我不得不对数据进行批处理更新,首先使用SQL参数进行更新,因为有成千上万的记录,所以花了90分钟时间进行更新。 (通过70兆位Internet连接写入Azure DB)。如您所愿,通过生成一个SQL命令,我能够在不到30秒的时间内写入相同的数据。

如果您要进行少量的更新和插入,尤其是在您编写的数据是用户输入的字符串的情况下,参数无疑是首选方法。

如您的问题所述,您不能使用SqlCommand执行更新命令,因此不能使用SQL参数。我对应该起作用的方法做了一些修改,并添加了一个新方法来转义您的字符串。它还将处理您的代码无法处理的NULL和空字符串。

public static string SStr(string s)
{
    return string.IsNullOrEmpty(s) ? "NULL" : "N'" + s.Replace("'","''") + "'";
}

private static void makeSQLThread(List<Product> products, List<string> sqlList)
{
    foreach (var item in products)
    {
        var formatSQl = $"UPDATE products SET ColorId = {item.ColorId}, Description = {SStr(item.Description)}, LongDescription = {item.LongDescription}, isAvailable = {item.isAvailable ? 1 : 0} WHERE Id = {item.Id};";

        Console.WriteLine(formatSQl);

        sqlList.Add(formatSQl);
    }
}

您不需要通过引用传递sqlList,因为您要添加它。如果您向产品添加了一个值,则实际上将更改调用该方法所用的列表的内容。区别在于,如果您在products = new List<product>();方法中添加了makeSQLThread,则发送给该方法的产品对象将不会被覆盖。如果添加了sqlList = new List<string>();,则传递给该方法的sqlList对象将被覆盖。

我不知道有多久才问过这个问题,但它仍然比评论中提供的答案更好。如此一来,您的Web开发人员就知道,有些人视力受损,并且在白色背景上使用灰色文本对于某些人来说可能很难看清(如在要求的日期)。我希望网站提供选择高对比度调色板的功能。