使用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置于表中?
答案 0 :(得分:6)
问题是该参数是预期的,但如果可空值为null
则不会添加。您需要通过以下方式解决此问题:
DBNull.Value
,如下所示:InfoCommand.Parameters.AddWithValue("@Pareto", (object)pareto ?? DbNull.Value);
@Pareto int = null
如果要使参数可选,则存储过程可能如下所示:
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);
}