存储过程参数插入错误的值

时间:2009-02-20 18:15:20

标签: sql stored-procedures parameters null

大家下午好,

我遇到存储过程插入错误值的问题。以下是我的存储过程的摘要...

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

3 个答案:

答案 0 :(得分:1)

我相信当你在像

这样的参数上设置默认值时
@differential int = null

您无需将其添加到SQL命令中。

尝试使用此代码,不要包含else ...

if (myobject.differential.HasValue)
{ 
   dbCmd.Parameters.AddWithValue("@differential", myobject.differential); 
}

答案 1 :(得分:0)

您确定差异列上没有默认值约束为零吗?

答案 2 :(得分:0)

同时检查表格上是否有触发器将空值设置为零。

相关问题