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);
我有这个 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);