2011-04-21 44 views
0

我有一张表,我想用一个简单的更新命令进行更新。用于更新的sqlcommand

protected void UpdateButton_Click(object sender, EventArgs e) 
     { 

     SqlCommand cmd = new SqlCommand("UPDATE KPI_DETAILS_TABLE SET KPI1_Status = 
     @KPI1_Status, KPI2_Status = @KPI2_Status, KPI3_Status = @KPI3_Status, 
     KPI4_Status = @KPI4_Status, KPI5_Status = @KPI5_Status, KPI6_Status = 
     @KPI6_Status, Overall_Status= @Overall_Status WHERE TokenID = '" + 
     DropDownList1.SelectedItem.Text + "' AND TimeSet = '" 
     + currentdate + "'", connection); 

     cmd.Parameters.AddWithValue("@KPI1_Status", DropboxKPI1.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@KPI2_Status", DropboxKPI2.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@KPI3_Status", DropboxKPI3.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@KPI4_Status", DropboxKPI4.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@KPI5_Status", DropboxKPI5.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@KPI6_Status", DropboxKPI6.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@Overall_Status", FinalStatus.SelectedItem.Text); 

     try 
     { 
      cmd.ExecuteNonQuery(); 
      Error1.Text = "KPI Status Successfully Updated !!"; 
     } 
     catch { Error1.Text = "Error during Updating status of KPIs"; } 
     finally { connection.Close(); } 
    } 

但是它抛出下面的异常错误:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

数据类型datetime在数据库中唯一的列是TimeSet。但是currentdate也是数据类型datetime

DateTime currentdate = DateTime.Now.ToLocalTime(); 

那么为什么这个错误会弹出?请帮忙。

回答

1

您的代码应该是这样的:

protected void UpdateButton_Click(object sender, EventArgs e) 
    { 

    SqlCommand cmd = new SqlCommand("UPDATE KPI_DETAILS_TABLE SET"+ 
     "KPI1_Status = @KPI1_Status, KPI2_Status = @KPI2_Status,"+ 
     "KPI3_Status = @KPI3_Status, KPI4_Status = @KPI4_Status,"+ 
     "KPI5_Status = @KPI5_Status, KPI6_Status = @KPI6_Status,"+ 
     "Overall_Status= @Overall_Status"+ 
     "WHERE TokenID = @ID AND TimeSet = @Time", connection); 

    cmd.Parameters.AddWithValue("@KPI1_Status", DropboxKPI1.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@KPI2_Status", DropboxKPI2.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@KPI3_Status", DropboxKPI3.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@KPI4_Status", DropboxKPI4.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@KPI5_Status", DropboxKPI5.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@KPI6_Status", DropboxKPI6.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@Overall_Status", FinalStatus.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@ID", DropDownList1.SelectedItem.Text); 
    cmd.Parameters.AddWithValue("@Time", DateTime.Now.ToLocalTime()); 
    try 
    { 
     cmd.ExecuteNonQuery(); 
     Error1.Text = "KPI Status Successfully Updated !!"; 
    } 
    catch { Error1.Text = "Error during Updating status of KPIs"; } 
    finally { connection.Close(); } 
} 
  1. 修复的烂摊子你SqlCommand对象的字符串中。
  2. 代替将局部变量添加到您的SqlCommand我添加了新的SqlParameters并定义了他们从(@ID,@Time)获取其值的位置。
0

而是使用DateTime.Now.ToString();来提供Currentdate并再试一次。

2

a)使用的值的参数在WHERE条款,以及为SET部分,

B),然后使用cmd.Parameters.AddWithValue("@TimeSet", DateTime.Now.ToLocalTime());

这也将保护你免受SQL注入。


I.e.如果您有日期时间值,请尝试将其保留为日期时间值,并且不要试图在任何时候将其视为字符串。让ADO.Net和SQL Server处理任何必要的转换。

+0

我得到了你说的。感谢您的宝贵意见。 但我有其他地方使用datetime.now.localtime()的这个值。所以不能直接在这里使用该方法。 – scooby 2011-04-21 08:02:45

+0

可以解释你的方法如何保护从sql注入的应用程序? – scooby 2011-04-21 08:12:05

+0

“如果您将数据访问代码作为问题的一部分发布到论坛中,并且人们回答”注意SQL注入!“或”使用参数查询!“,您可能会疑惑他们为什么会这么担心......” http://forums.asp.net/p/1568268/3920715.aspx ..关于Sql Injection和参数化quires的更多信息请查看这篇文章 – lKashef 2011-04-21 08:15:17