SQL允许C#中的表为null

时间:2013-04-15 12:23:04

标签: c# sql sql-server-2008

使用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#代码中,我确保使用nullable int,但是当我运行代码时出现错误:

  

例外:抛出:"程序或功能' updateMain'期望参数' @ Pareto',这是未提供的。" (System.Data.SqlClient.SqlException)
  抛出了System.Data.SqlClient.SqlException:"过程或函数' updateMain'期望参数' @ Pareto',这是未提供的。"

那么如何阻止此错误并将null置于表中?

3 个答案:

答案 0 :(得分:6)

问题是该参数是预期的,但如果可空值为null则不会添加。您需要通过以下方式解决此问题:

  1. 手动设置DBNull.Value,如下所示:InfoCommand.Parameters.AddWithValue("@Pareto", (object)pareto ?? DbNull.Value);
  2. 或者将参数设为可选,如:@Pareto int = null
  3. 如果要使参数可选,则存储过程可能如下所示:

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

    修改
    我从接受的答案中得出结论,由于类型不匹配问题,您需要将其转换为object。为了完整起见,我正在修复我的答案。

答案 1 :(得分:4)

使用

InfoCommand.Parameters.AddWithValue("@Pareto", (Object)pareto ?? DBNull.Value);

答案 2 :(得分:1)

试试这个:

if (pareto != null)
{
  InfoCommand.Parameters.AddWithValue("@pareto", pareto);
}
else
{
  InfoCommand.Parameters.AddWithValue("@pareto", DBNull);
}