【问题标题】:Stored Procedure parameter inserting wrong value存储过程参数插入错误值
【发布时间】: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


【解决方案1】:

我相信当你在一个参数上设置默认值时

@differential int = null

您不需要将它添加到您的 SQL 命令中。

只用这个试试代码,不要包含 else...

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

【讨论】:

  • RSolberg - 这是我尝试解决问题的迭代之一,不幸的是它仍然没有解决问题。
  • 无法完全复现,我只是在猜测.....调用执行命令之前的参数值是多少?那个时候是0吗?
  • RSolberg - 实际上这是我没有检查过的东西......我知道传递给它的 VALUE 是 null 但我没有真正检查过参数一旦设置,让我检查一下转发。谢谢你的建议。
  • RSolberg - 我刚刚运行程序并检查了调试信息和 dbCmd.Parameters["@differential"].Value is "" 的值
  • 您希望该值是多少?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    同时检查表上是否存在将空值设置为零的触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多