【发布时间】:2009-02-20 18:15:20
【问题描述】:
大家下午好,
我遇到了插入错误值的存储过程的问题。下面是我的存储过程的总结...
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();
在数据库表中,差异列是一个可以为空的int,没有默认值。
“myobject”的微分属性是int?数据类型默认设置为null。
问题是当我运行存储过程时,差异列以 0 结束。即使“myobject.differential”为空并且我传入了 DBNull.Value,该列仍然以 0 结束。我试过不将@differial 传递到存储过程中,它仍然将列设置为0。
我尝试了许多不同的解决方案,但都没有奏效。
提前感谢您的帮助,
斯科特·维库斯基
【问题讨论】:
-
不是对存储过程的总结,能否提供实际代码?像这样的问题通常是某处的单行代码、拼写错误等造成的。
-
Tom H. - 不幸的是,出于披露原因,我的雇主不允许我发布整个存储过程,对此我很抱歉。我可以告诉你的是,差异更新是存储过程中唯一的更新,也是这个存储过程中唯一触及差异的地方。
-
看起来您找到了答案,但如果您无法发布原始代码,另一种选择是使用精简版本重现并确认错误。
标签: sql stored-procedures parameters null