1

使用 SQL Server 2008、WinForms C# .NET 4.5、Visual Studio 2012。

我有一个查询,该查询当前使用来自GridView.

下面是调用存储过程的代码:

public void UpdateMain(string part, int? pareto)
{
  try
  {
    using (SqlConnection AutoConn = new SqlConnection(conn32))
    {
      AutoConn.Open();
      using (SqlCommand InfoCommand = new SqlCommand())
      {
        using (SqlDataAdapter infoAdapter = new SqlDataAdapter(InfoCommand))
        {
          InfoCommand.Connection = AutoConn;
          InfoCommand.CommandType = CommandType.StoredProcedure;
          InfoCommand.CommandText = "dbo.updateMain";
          InfoCommand.Parameters.AddWithValue("@part", part);
          InfoCommand.Parameters.AddWithValue("@pareto", pareto);
          InfoCommand.CommandTimeout = 180;

          InfoCommand.ExecuteNonQuery();
        }
      }
    }
  }
  catch (Exception e)
  {
    //MessageBox.Show("Error in connection :: " + e);
  }
}

这是SQL:

ALTER PROCEDURE [dbo].[updateMain]
    @part varchar(255),
    @Pareto int
as
    UPDATE dbo.ParetoMain 
    SET NewPareto = @Pareto 
    WHERE Part = @part

如您所见,没有什么花哨的。我遇到的问题是Newpareto不一定要有值,所以我需要它来允许空值。我确保该表允许空值。在我的 C# 代码中,我确保使用可为空的 int,但是当我运行代码时出现错误:

异常:抛出:“过程或函数'updateMain'需要参数'@Pareto',但未提供。” (System.Data.SqlClient.SqlException)
引发了 System.Data.SqlClient.SqlException:“过程或函数 'updateMain' 需要参数 '@Pareto',但未提供。”

那么如何停止此错误并将空值放入表中?

4

3 回答 3

6

问题是该参数是预期的,但如果可为空的值为null. 您需要通过以下任一方式解决此问题:

  1. 手动设置它,DBNull.Value如下所示:InfoCommand.Parameters.AddWithValue("@Pareto", (object)pareto ?? DbNull.Value);
  2. 或者通过使参数可选,如下所示:@Pareto int = null

如果您想让参数成为可选参数,您的存储过程可能如下所示:

ALTER PROCEDURE [dbo].[updateMain]
@part varchar(255),
@Pareto int = null
as
UPDATE dbo.ParetoMain SET NewPareto =@Pareto WHERE Part = @part

编辑我从接受的答案中获取它,由于类型不匹配问题
,您需要转换为该答案。object为了完整起见,我正在修复我的答案。

于 2013-04-15T12:30:16.093 回答
4

利用

InfoCommand.Parameters.AddWithValue("@Pareto", (Object)pareto ?? DBNull.Value);
于 2013-04-15T12:28:03.767 回答
1

尝试这个:

if (pareto != null)
{
  InfoCommand.Parameters.AddWithValue("@pareto", pareto);
}
else
{
  InfoCommand.Parameters.AddWithValue("@pareto", DBNull);
}
于 2013-04-15T12:29:58.483 回答