代码之家  ›  专栏  ›  技术社区  ›  Scott Vercuski

存储过程参数插入错误值

  •  1
  • Scott Vercuski  · 技术社区  · 16 年前

    大家下午好,

    存储过程插入不正确的值时出现问题。下面是我的存储过程的摘要…

    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();
    

    在数据库表中,differential列是一个可以为空的int,没有默认值。

    “myObject”的微分性质是int?默认情况下,数据类型设置为空。

    问题是,当我运行存储过程时,差分列将以0结束。即使“myObject.differential”为空,并且我传入了dbnull.value,该列仍然以0结束。我尝试不将@differential传递到存储过程中,但它仍然将列设置为0。

    我尝试过许多不同的解决方案,但没有任何效果。

    提前感谢您的帮助,

    史葛·维库斯基

    3 回复  |  直到 16 年前
        1
  •  1
  •   RSolberg    16 年前

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

    @differential int = null
    

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

    尝试只使用此代码,而不包括其他代码…

    if (myobject.differential.HasValue)
    { 
       dbCmd.Parameters.AddWithValue("@differential", myobject.differential); 
    }
    
        2
  •  0
  •   James    16 年前

    您确定微分列没有 默认值约束 它是零吗?

        3
  •  0
  •   HLGEM    16 年前

    还要检查表上是否有触发器将空值设置为零。