所以我连接的是一个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.
答案 0 :(得分:3)
在不了解更多问题的情况下有两件可能的事情:
System.DateTime.Now
,而不是System.DateTime.Now.ToString()
,因为参数属于DateTime
数据类型。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;
}
答案 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()。