如何将变量添加到我的SQL字符串并成功对服务器运行?我想通过我的C#
运行这个声明protected void RunSQLQuery(string salesman, string connectionString)
{
SqlConnection cnn;
SqlCommand cmd;
StringBuilder sql = new StringBuilder();
SqlDataReader reader;
cnn = new SqlConnection(connectionString);
sql = new StringBuilder();
sql.Append("update database ");
sql.Append("set shippdate = GetDate() ");
sql.Append("where salesman = "' + salesman + "'");
sql.Append("and managerapproval is not null ");
cnn.Open();
cmd = new SqlCommand(sql.ToString(), cnn);
reader = cmd.ExecuteReader();
reader.Close();
cmd.Dispose();
cnn.Close
}
这会出现多个编译错误,强调我的+推销员+代码。错误是:
仅分配,调用,增量,减量和新对象 表达式可以用作语句
预期
)预期
常量
中字符文字换行符中的字符太多
答案 0 :(得分:12)
您不添加select count(*) from table2
引用的字符串对象,您要将salesman
添加为string literal。
只需将其添加为参数,如;
salesman
使用ExecuteNonQuery
执行命令,而不是var cmd = new SqlCommand("update database set shippdate = GetDate() where salesman = @salesman");
cmd.Parameters.Add("@salesman", salesman);
...
。这个SqlDataReader
用于返回一些数据。
但更重要的是,您应该始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。
还可以使用using
statement自动处理您的连接和命令,而不是手动调用SqlDataReader
或Close
方法。
作为一个完整的例子;
Dispose
对于我自己,我总是希望使用SqlParameterCollection.Add(string, SqlDbType, Int32)
overload来指定我的参数类型及其大小,但由于从未提及您的protected void RunSQLQuery(string salesman, string connectionString)
{
using(var cnn = new SqlConnection(connectionString))
using(var cmd = cnn.CreateCommand())
{
cmd.CommandText = @"update database set shippdate = GetDate()
where salesman = @salesman";
// I assume your column is nvarchar
cmd.Parameters.Add("@salesman", SqlDbType.NVarChar).Value = salesman;
cnn.Open();
cmd.ExecuteNonQuery();
}
}
列类型,我无法发布在我的例子中。
答案 1 :(得分:0)
正如您还可以从语法突出显示中看到的那样,编译错误是由于您未在sql.Append("where salesman = "' + salesman + "'");
中正确转义引号而引起的。
作为旁注,你绝不应该在没有先验证它们的情况下将字符串插入到sql查询中,或者你对sql注入是开放的,例如如果我将"''; drop table database;"
作为推销员参数传递。最好使用SqlParameter
。
答案 2 :(得分:0)
如上面的答案所述,是的,以这种方式编写查询并不是一个好方法。但是如果你只想这样做,你将不得不改变:
sql.Append("where salesman = "' + salesman + "'");
到
sql.Append("where salesman = '" + salesman + "'");
答案 3 :(得分:0)
我建议使用sql命令中的AddWithValue
方法与UPPER
函数结合使其不区分大小写:
SqlCommand cmd = cnn.CreateCommand();
cmd.CommandText = "UPDATE database SET shippdate = GetDate() WHERE UPPER(salesman) = UPPER(@salesMan)";
cmd.Parameters.AddWithValue("@salesMan", salesman);
if (cnn.State.Equals(ConnectionState.Closed))
{
cnn.Open();
}
cmd.ExecuteNonQuery();
cnn.Close();