【问题标题】:C# if statement with dropdownlist.selectedvalueC# if 语句与 dropdownlist.selectedvalue
【发布时间】:2011-03-24 10:19:51
【问题描述】:

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

我的表有 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. 

【问题讨论】:

  • 您的问题究竟是什么?我猜你的存储过程可能需要更新以检查 @Closed_Date 是否为空,如果是则不更新它?还是?
  • 我想通了。我删除了第一次状态更新,它现在可以工作了

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


【解决方案1】:

虽然,很可能不是您问题的根源,但我认为您在添加参数值时太过分了。为什么不直接使用 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); 
    }  

附带说明,您可以避免在 C# 命令中添加 @Closed_Date, null,只需设置存储过程以在过程本身中将值设置为 null。然后它变成可选的。例如

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

【讨论】:

    【解决方案2】:

    在不了解该问题的情况下可能发生的两件事:

    1. 您想使用System.DateTime.Now,而不是System.DateTime.Now.ToString(),因为参数属于DateTime 数据类型。
    2. 你不能直接将null传递给数据库服务器,如果你想要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;
    } 
    

    【讨论】:

    • 这对我不起作用。错误:过程或函数 iz_sp_updateticket 指定的参数过多。
    【解决方案3】:

    你遇到了什么错误?

    顺便说一句,我看到一个可能的问题:您想使用 System.DateTime.Now,而不是 System.DateTime.Now.ToString()。

    【讨论】:

    • 错误:过程或函数 iz_sp_updateticket 指定的参数过多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2012-02-21
    相关资源
    最近更新 更多