2010-08-02 59 views
1

所以我連接一個SQL數據庫。 我有一個asp.net頁面,當用戶選擇狀態下拉列表並選擇要關閉的值,然後單擊更新票證按鈕,我需要它來更新表中的Closed_date列。C#if語句dropdownlist.selectedvalue

我的表格有列Closed_Date類型的日期時間。 我有一個存儲過程根據票證#更新該列。

這裏是我有麻煩:

 con = new SqlConnection(_strConStr); 
     cmd = new SqlCommand(); 
     cmd.Connection = con; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "iz_sp_updateticket"; 
     cmd.Parameters.Add(new SqlParameter("@Priority", SqlDbType.Int)).Value = ddlPriority.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Environment", SqlDbType.VarChar, 50)).Value = ddlEnv.SelectedValue; 
     cmd.Parameters.Add(new SqlParameter("@Info", SqlDbType.VarChar)).Value = txtMessage.Text; 
     cmd.Parameters.Add(new SqlParameter("@Ticket", SqlDbType.Int)).Value = txtTicket.Text; 
     if (ddlStatus.SelectedValue == "Closed") 
     { 
      cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
      cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = System.DateTime.Now; 
     } 
     else 
     { 
      cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = ddlStatus.SelectedValue; 
      cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = DBNull.Value; 
     } 

     con.Open(); 
     cmd.ExecuteNonQuery(); 

這裏是我的存儲過程:

CREATE procedure [dbo].[iz_sp_updateticket] 
    @Ticket int, 
    @Priority varchar(50), 
    @Status varchar(50), 
    @Environment varchar(50), 
    @Info varchar(max), 
    @Closed_date datetime 
as 
    UPDATE stotickets 
    SET 
     Priority = @Priority, 
     [Status] = @Status, 
     Environment = @Environment, 
     Info = @Info, 
     Closed_date = @Closed_date 
    WHERE Ticket = @Ticket 

錯誤

Procedure or function iz_sp_updateticket has too many arguments specified. 
+0

什麼恰恰是你的問題?我猜可能你的存儲過程需要更新,以檢查@Closed_Date是否爲空,如果沒有更新它?要麼? – 2010-08-02 21:01:02

+0

我想通了。我刪除了第一個狀態更新,它現在可以工作 – IGor 2010-08-02 21:44:27

回答

3

兩個潛在的東西:

  1. 你想用System.DateTime.Now,不System.DateTime.Now.ToString()因爲參數是DateTime數據類型。如果你想要null你需要使用DBNull.Value

的代碼會是這個樣子:

if (ddlStatus.SelectedValue == "Closed") 
{ 
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = 
     ddlStatus.SelectedValue; 
cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = 
     System.DateTime.Now; 
} 
else 
{ 
cmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.VarChar, 50)).Value = 
     ddlStatus.SelectedValue; 
cmd.Parameters.Add(new SqlParameter("@Closed_Date", SqlDbType.DateTime)).Value = 
     DBNull.Value; 
} 
+0

這沒有爲我工作。 錯誤:過程或函數iz_sp_updateticket指定的參數太多。 – IGor 2010-08-02 21:39:09

+0

NVM工作!我剛看到我有兩個狀態更新 – IGor 2010-08-02 21:42:37

0

什麼是你的錯誤得到些什麼?

非親愛的,我看到一個可能的問題:你想使用System.DateTime.Now,而不是System.DateTime.Now.ToString()。

+0

錯誤:過程或函數iz_sp_updateticket指定的參數太多。 – IGor 2010-08-02 21:40:46

2

雖然,很可能不是你問題的根源,但我認爲你會加入你的參數值。爲什麼不使用AddWithValue方法。 SQL足夠聰明,可以根據過程中定義的值的類型瞭解要傳入的值類型。例如

if (ddlStatus.SelectedValue == "Closed") 
    { 
     cmd.Parameters.AddWithValue("@Status",ddlStatus.SelectedValue); 
     cmd.Parameters.AddWithValue("@Closed_Date",System.DateTime.Now); 
    } 
    else 
    { 
     cmd.Parameters.Add("@Status",ddlStatus.SelectedValue); 
     cmd.Parameters.Add("@Closed_Date", null); 
    } 

在一個側面說明,您可以避免添加@Closed_Date,空在C#命令,通過簡單的設置你的存儲過程,該過程本身中的值設置爲null。然後它變成可選的。例如不知道更多有關問題

CREATE PROCEDURE myProcedure 
    @Status VARCHAR(255), 
    @Closed_Date DATETIME = null 
AS 
BEGIN 
    -- Do something 
END