我正在尝试将SQL语句编写为字符串文字,其中包含两个变量,如下所示 -
String str="abc"; int val=123;
String sql=@"SELECT Column1, Column2
FROM Table
WHERE Column1= '"" + str + ""' AND Column2 > "" + val + ""
ORDER BY Column1";
但这些变量不被视为变量。有什么帮助吗?
更新: 添加了order by子句的屏幕截图。有红色卷曲下划线。
答案 0 :(得分:5)
我个人会重写查询以使用参数化查询。如果您输入的字符串来自用户可输入的值,则可能会在加载时获得更好的性能并阻止SQL注入。
String sql=@"SELECT Column1, Column2
FROM Table
WHERE Column1 = @str AND Column2 > @val
ORDER BY Column1";
using(var connection = new SqlConnection(_connectionString)
using(var command = new SqlCommand(sql, connection)
{
connection.Open();
command.Parameters.Add("@str", SqlDbType.NVarChar, Column1MaxTextLength).Value = str;
command.Parameters.Add("@val", SqlDbType.Int).Value = val;
using(var reader = command.ExecuteReader())
{
//...
}
}
编辑:要解决截图,在最后一组引号之前需要另一个@符号。
String sql=@"SELECT Column1, Column2
FROM Table
WHERE Column1= '" + str + "' AND Column2 > " + val + @"
ORDER BY Column1"; // ^-- You are missing this guy
但我仍然认为你应该重写以使用参数化查询。
答案 1 :(得分:3)
首先尝试使用参数化查询来避免SQL注入。您可以阅读更多here。
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT Column1, Column2 FROM Table WHERE Column1=@col1 AND Column2 > @col2 ORDER BY Column1, Column2 " , conn))
{
cmd.Parameters.AddWithValue("@col1", str);
cmd.Parameters.AddWithValue("@col2", val);
using(var reader = cmd.ExecuteReader())
{
//...
}
}
}
但要回答你的问题:
String str="abc";
int val=123;
String sql=@"SELECT Column1, Column2
FROM Table
WHERE Column1= '" + str + "' AND Column2 > " + val + "";
或者您可以按照Aron
String str="abc";
int val=123;
String sql=String.Format(@"SELECT Column1, Column2
FROM Table
WHERE Column1= '{0}' AND Column2 > {1}",str,val);
答案 2 :(得分:0)
String str = "abc"; int val = 123;
StringBuilder strbuilder = new StringBuilder();
strbuilder.Append("SELECT Column1, Column2 FROM Table WHERE Column1=");
strbuilder.Append("'" + str + "'");
strbuilder.Append(" AND Column2 >");
strbuilder.Append("'" + val.ToString() + "'");
用户字符串构建器可能对您有所帮助。