带有dropdownlist.selectedvalue的C#if语句

时间:2010-08-02 20:57:43

标签: c# asp.net sql ado.net

所以我连接的是一个sql数据库。 我有一个asp.net页面,当用户选择状态的下拉列表并选择值为Closed时,然后单击更新票证按钮,我需要它来更新表中的Closed_date列。

我的表有Closed_Date类型的datetime。 我有一个存储过程,根据票证#。

更新该列

这是我遇到麻烦的地方:

        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. 

3 个答案:

答案 0 :(得分:3)

在不了解更多问题的情况下有两件可能的事情:

  1. 您希望使用System.DateTime.Now,而不是System.DateTime.Now.ToString(),因为参数属于DateTime数据类型。
  2. 如果您需要使用null null,则无法直接将DBNull.Value传递给数据库服务器。
  3. 代码看起来像这样:

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

答案 1 :(得分:2)

虽然很可能不是问题的根源,但我认为你在添加参数值时会过分夸大。为什么不使用AddWithValue方法。 SQL足够聪明,可以根据过程中定义的值的类型来了解您尝试传入的值类型。 e.g。

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

另外,您可以避免在C#命令中添加@Closed_Date,null,只需设置存储过程以在过程本身中将值设置为null。然后它变成可选的。 e.g。

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

答案 2 :(得分:0)

你得到的错误是什么?

副手,我看到一个可能的问题:你想使用System.DateTime.Now,而不是System.DateTime.Now.ToString()。