将安全的SQL语句创建为字符串

Jas*_*son 11 .net c# sql stringbuilder concatenation

我正在使用C#和.NET 3.5.我需要生成并存储一些T-SQL插入语句,稍后将在远程服务器上执行.

例如,我有一个Employees数组:

new Employee[]
{
   new Employee { ID = 5, Name = "Frank Grimes" },
   new Employee { ID = 6, Name = "Tim O'Reilly" }
}
Run Code Online (Sandbox Code Playgroud)

我需要最终得到一个字符串数组,如下所示:

"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"
Run Code Online (Sandbox Code Playgroud)

我正在看一些使用String.Format创建insert语句的代码,但这感觉不对.我考虑使用SqlCommand(希望做这样的事情),但它没有提供将命令文本与参数组合的方法.

仅仅替换单引号并构建字符串就足够了吗?

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
    employee.ID,
    replaceQuotes(employee.Name)
    );
Run Code Online (Sandbox Code Playgroud)

这样做时我应该关注什么?源数据相当安全,但我不想做太多假设.

编辑:只是想指出在这种情况下,我没有SqlConnection或任何方式直接连接到SQL Server.这个特定的应用程序需要生成sql语句并将它们排队等待在其他地方执行 - 否则我将使用SqlCommand.Parameters.AddWithValue()

Mit*_*eat 17

像这样创建您的SqlCommand对象:

SqlCommand cmd = new SqlCommand(
        "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);

SqlParameter param  = new SqlParameter();
param.ParameterName = "@id";
param.Value         = employee.ID;

cmd.Parameters.Add(param);

param  = new SqlParameter();
param.ParameterName = "@name";
param.Value         = employee.Name;

cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

  • 使用"cmd.AddWithValue("@ id",employee.ID);" 更加温和. (5认同)

Jon*_*eet 7

使用参数化命令.将参数传递给远程服务器,然后调用SQL Server,仍然保持SQL本身和参数值之间的区别.

只要您从不将处理数据作为代码混合,您应该没问题.

  • 当输出是带有现成的“INSERT”命令以及要插入的数据的“.sql”脚本文件这一硬性要求时,这似乎并没有提供解决方案。 (2认同)

KMX*_*KMX 5

以这种方式修复您的替换引号功能:

string replaceQuotes(string value) {
     string tmp = value;
     tmp = tmp.Replace("'", "''");
     return tmp;
}
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 使用参数要容易得多,想想所有必须转义的字符。而且这也不是 SQL 注入安全的。 (3认同)