2011-04-21 45 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