SQL 字符串问题

SQL String issue

我有这个 INSERT 声明,

"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " +
$"VALUES ('{name}','{email}','{address}')";

正如您在第 2 行看到的那样,我添加了 '$'。此版本的代码有效,但在 VS2012 中不受支持。

我正在尝试将它转换成类似这样的东西,但我遇到了很多问题,因为它非常复杂。

"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " +
"VALUES (''" + name + "', ''" + email + "', ''" + address + "')";

上面的这个版本不工作。基本上我试图在不使用 '$' 任何想法?

的情况下进行查询

您应该使用参数化查询,例如,如果您使用 ADO.NET,请使用:

. . .
using(SqlConnection connection = new SqlConnection("yourConnectionString"))
{
    SqlCommand cmd = connection.CreateCommand();
    cmd.CommandText = @"INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress)
                        VALUES (@Name, @Email, @Address)";
    cmd.Parameters.AddRange(new SqlParameter[]
    {
        new SqlParameter("@Name", name),
        new SqlParameter("@Email", email),
        new SqlParameter("@Address", address)
    });
    connection.Open();
    cmd.ExecuteNonQuery();
}
. . .

您可以找到其他 sql 提供商类型示例 here.

不要 这样做,它会使您暴露于 SQL 注入攻击 转换问题。如果您尝试使用字符串连接传递日期,日期会是什么样子?小数?

实际上使用参数化查询更容易:

//Create a SqlCommand that can be reused
SqlCommand _cmdInsert;

var sql="INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " + 
        "VALUES (@name,@email,@address)";
var cmd=new SqlCommand(cmd);
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 30);
cmd.Parameters.Add("@email", SqlDbType.NVarChar, 20);
cmd.Parameters.Add("@address", SqlDbType.NVarChar, 50);
_cmdInsert=cmd;

以后可以通过设置连接和参数值直接使用命令:

using(var connection=new SqlConnection(theConnectionString)
{
    _cmdInsert.Connection=connection;
    _cmdInsert.Parameters["@name"].Value=someName;
    ...
    connection.Open();
    _cmdInsert.ExecuteNonQuery();
}

参数化查询将强类型值 RPC 调用中的查询一起传递。 DateTime 作为 DateTime(或等效的二进制文件)传递给服务器,而不是作为字符串。这样,就没有转换错误。无论值包含什么,它都不会与查询本身混合,因此不会执行。即使 address 包含 '); drop table Users;-- 它也不会被执行。

另一种选择是使用像 Dapper 这样的 microORM。 Dapper 使用反射映射参数名称和数据属性来创建和执行参数化查询:

var insertStmt="INSERT INTO [CustomerInfo] (CustomerName, CustomerEmail, CustomerAddress) " + 
        "VALUES (@name,@email,@address)";

connection.Execute(insertStmt, new { name=someName,email=someEmail, address=someAddress});

如项目页面所示,如果传递参数数组,则可以多次执行相同的查询:

var myItems=new[] 
            {
                new {name=someName,email=someEmail, address=someAddress}
            };
connection.Execute(insertStmt, myItems);