2016-01-13 166 views
0

如何将变量添加到我的SQL字符串中并成功地在服务器上运行它?我想通过我的C#运行这个声明#在SQL字符串中使用变量

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 
} 

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

只有转让,电话,递增,递减和新对象 表达式可以作为一份声明中

;预计

)性格预期

字符太多面值换行符在不断

+6

哪里有人学习这个废话。 – Phill

+2

#1 - 这是不好的。连接会为您打开SQL注入攻击。查找SQL参数化。 #2 - 您的报价按错误顺序排列:'salesman =''+ salesman' should''salesman ='“+ salesman' –

回答

12

您是添加字符串对象salesman是指,要添加salesman作为string literal

只需添加它作为参数,如;

var cmd = new SqlCommand("update database set shippdate = GetDate() where salesman = @salesman"); 
cmd.Parameters.Add("@salesman", salesman); 
... 

并使用ExecuteNonQuery来执行你的命令,不SqlDataReader。这SqlDataReader是用于返回一些数据。

但更重要的是,您应该始终使用parameterized queries。这种字符串连接对于SQL Injection攻击是开放的。

还可以使用using statement处置您的连接和命令自动代替手动调用CloseDispose方法。

作为一个完整的例子;

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

至于我自己,我总是喜欢使用SqlParameterCollection.Add(string, SqlDbType, Int32) overload指定我的参数类型,它的大小,但因为你永远提到salesman列的类型,我不能在我的例子张贴此。

+0

看起来像您在查询中的GetDate()后出现错字。 – user1666620

+0

@ user1666620啊,谢谢。固定。 –

+0

@SonerGönül - 我认为使用var变量类型是不好的做法?我误解了吗? –

0

正如您从语法突出显示中还可以看到的那样,编译错误是由于您在sql.Append("where salesman = "' + salesman + "'");中没有正确地转义引号而造成的。作为一个方面说明,你不应该在没有首先验证它们的情况下将字符串插入到sql查询中,或者你打开sql注入,例如,如果我通过"''; drop table database;"作为推销员参数。最好使用SqlParameter

0

正如在上面的答案中提到的,是的,以这种方式写查询不是一个好办法。但仍然,如果你只想做这样的说法,你将不得不改变:

sql.Append("where salesman = "' + salesman + "'"); 

sql.Append("where salesman = '" + salesman + "'"); 
+0

停止教人不良习惯。你说“你不应该这样做”,但你仍然只是表现出不好的方式去做,为什么?请解释您的理由,鼓励人们编写危险的代码,这可能会导致系统中的安全隐患。 –

0

我会建议使用AddWithValue方法从您的SQL命令与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(); 
+0

这并不直接回答这个问题。无论如何,SQL通常不区分大小写。 –