2010-08-02 56 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