0

データベースの値を更新しようとしていますが(ステータスメッセージを返している間)、次のInvalidCastErrorが発生します-オブジェクトをDBNullから他のタイプにキャストできません。ただし、情報はデータベースで更新されます。'true'または同等の成功を返したくないようです。以下に示すコード:

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
4

3 に答える 3

3

経験に基づいた推測をすると、sqlComm.Parameters["@Message"].Valueが戻ってくると思いますSystem.DBNull.Value

@@ROWCOUNTそれが1 に等しいので、設定されていない可能性@Messageはありますか?

于 2013-02-27T22:34:28.123 に答える
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
于 2013-02-27T23:33:05.127 に答える
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
于 2013-02-27T23:19:48.573 に答える