2013-02-27 22 views
0

我试图更新数据库中的值(同时返回状态信息)并获取以下InvalidCastError - 对象无法从DBNull转换为其他类型。但是,信息在数据库中更新。它似乎不想回到'真实'或成功的等值。如下图所示代码:即使执行成功,C#对象也不能从DBNull错误转换

C#:

public bool Update(Customer pCustomer) 
    { 
     using (SqlConnection sqlConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
     { 
      using (SqlCommand sqlComm = new SqlCommand("Update_Customer", sqlConnect)) 
      { 
       sqlComm.CommandType = CommandType.StoredProcedure; 
       //Other items to update (Not causing issues) 

       sqlComm.Parameters.Add("@Message", SqlDbType.Bit).Direction = ParameterDirection.Output; 
       sqlComm.Connection = sqlConnect; 

       try 
       { 
        sqlComm.Connection.Open(); 
        sqlComm.ExecuteNonQuery(); 
        return Convert.ToBoolean(sqlComm.Parameters["@Message"].Value); 
       } 

       catch(Exception) 
       { 
        throw; 
       } 

       finally 
       { 
        sqlComm.Connection.Close(); 
       } 
      } 
     } 
    } 

SQL:

 //Unrelevent code removed 
    AS 
BEGIN 
    BEGIN TRY 
     BEGIN TRAN 
      BEGIN 
       UPDATE Customer 
       SET 
        Password = @Password, 
        RecordTimeStamp = @NewRecordTimeStamp 
       WHERE CustomerID = @CustomerID AND RecordTimeStamp = @OldRecordTimeStamp 
      END 
      IF @@ROWCOUNT <> 1 
       BEGIN 
        Set @Message = 1 
       END 
     IF @@ERROR <> 0 
      ROLLBACK TRAN 
     ELSE 
      COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     DECLARE @Err nvarchar(500) 
     SET @Err = ERROR_MESSAGE() 
     RAISERROR(@Err, 16, 1) 
    END CATCH 
END 
GO 
+0

你检查,看看是否有任何您发送或返回是'null'? – Brian 2013-02-27 22:32:10

+0

一切都有一个值,它在数据库中正确更新。只是似乎没有注册成功更新。 – ZeeeeeV 2013-02-27 22:32:54

+1

好吧,数据库中的所有内容都更新了,但是'@ Message'里面有“True”还是“False”? – 2013-02-27 22:34:00

回答

3

以一个猜测,我觉得sqlComm.Parameters["@Message"].Value将返回System.DBNull.Value

是否有可能@@ROWCOUNT等于1那么因此@Message没有被设置?

+0

+1 - 看起来你打败了我的答案。 – 2013-02-27 23:08:40

0

除非我的T-SQL是可怕的,这应该工作。

BEGIN 
    SET @Message = 0; 

    BEGIN TRANSACTION 

    BEGIN TRY 
     UPDATE Customer 
     SET Password  = @Password, 
      RecordTimeStamp = @NewRecordTimeStamp 
     WHERE CustomerID = @CustomerID 
     AND RecordTimeStamp = @OldRecordTimeStamp 

     IF @@ROWCOUNT <> 1 
      Set @Message = 1; 

     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 

     DECLARE @Err nvarchar(500) 
     SELECT @Err = ERROR_MESSAGE() 
     RAISERROR(@Err, 16, 1) 

     ROLLBACK TRANSACTION 
    END CATCH 
END 
1
AS 
BEGIN 
Set @Message = 0 
    BEGIN TRY 
     BEGIN TRAN 
      BEGIN 
       UPDATE Customer 
       SET 
        Password = @Password, 
        RecordTimeStamp = @NewRecordTimeStamp 
       WHERE CustomerID = @CustomerID AND RecordTimeStamp = @OldRecordTimeStamp 
      END 
      IF @@ROWCOUNT = 1 
        Set @Message = 1 
      END 
      IF @@ERROR <> 0 
      ROLLBACK TRAN 
      ELSE 
      COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     DECLARE @Err nvarchar(500) 
     SET @Err = ERROR_MESSAGE() 
     RAISERROR(@Err, 16, 1) 
    END CATCH 
END 
GO 
相关问题