在SQL字符串中使用变量

时间:2016-01-13 14:08:49

标签: c# sql-server

如何将变量添加到我的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
}

这会出现多个编译错误,强调我的+推销员+代码。错误是:

  

仅分配,调用,增量,减量和新对象   表达式可以用作语句

     

预期

     

)预期

     

常量

中字符文字换行符中的字符太多

4 个答案:

答案 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自动处理您的连接和命令,而不是手动调用SqlDataReaderClose方法。

作为一个完整的例子;

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();