大家下午好,
我遇到存储过程插入错误值的问题。以下是我的存储过程的摘要...
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[InsertDifferential]
@differential int = null
AS
BEGIN TRY
BEGIN TRANSACTION
UPDATE
DifferentialTable
SET
differential = @differential
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int, @ErrorState INT
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR(@ErrMsg, @ErrSeverity, @ErrorState);
END CATCH
以下是我用来调用存储过程的代码......
SqlConnection dbEngine = new SqlConnection(connectionString);
SqlCommand dbCmd = new SqlCommand("InsertDifferential", dbEngine);
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd);
dbCmd.CommandType = CommandType.StoredProcedure;
if (myobject.differential.HasValue)
{ dbCmd.Parameters.AddWithValue("@differential", myobject.differential); }
else
{ dbCmd.Parameters.AddWithValue("@differential", DBNull.Value); }
dbCmd.ExecuteNonQuery();
在数据库表中,差异列是可以为null的int,没有默认值。
“myobject”的差异属性是一个int?数据类型默认设置为null。
问题是当我运行存储过程时,差分列会以0结束。即使“myobject.differential”为null并且我传入DBNull.Value,该列仍然会以0为止。我已经尝试不将@differential传递给存储过程,它仍然将列设置为0。
我尝试了许多不同的解决方案,但没有任何效果。
提前感谢您的任何帮助,
Scott Vercuski
答案 0 :(得分:1)
我相信当你在像
这样的参数上设置默认值时@differential int = null
您无需将其添加到SQL命令中。
尝试使用此代码,不要包含else ...
if (myobject.differential.HasValue)
{
dbCmd.Parameters.AddWithValue("@differential", myobject.differential);
}
答案 1 :(得分:0)
您确定差异列上没有默认值约束为零吗?
答案 2 :(得分:0)
同时检查表格上是否有触发器将空值设置为零。