2

我正在运行一个带有硬编码值的存储过程。该命令成功执行,没有任何错误。但是数据库中的数据没有更新。如果我使用 SQL Server 运行该存储过程,则数据正在更新。我的错误是什么?

C# 代码

using (SqlTransaction sqlTrans = con.BeginTransaction())
{
    using (SqlCommand AdjustTax = new SqlCommand("GP_SOP_AdjustTax", con, sqlTrans))
    {
        try
        {
            AdjustTax.CommandType = CommandType.StoredProcedure;
            AdjustTax.Parameters.Add("@IN_SOPType", SqlDbType.Int).Value = 3;
            AdjustTax.Parameters.Add("@IN_SOPNo", SqlDbType.VarChar).Value = "stdinv2278";
            AdjustTax.Parameters.Add("@IN_AdjustAmount", SqlDbType.Int).Value = 0.04;
            AdjustTax.Parameters.Add("@O_iError", SqlDbType.Int, 250);
            AdjustTax.Parameters["@O_iError"].Direction = ParameterDirection.Output;

            if (con == null || con.State == ConnectionState.Closed)
            {
                con.Open();
            }

            AdjustTax.ExecuteNonQuery();
            int Error = (int)AdjustTax.Parameters["@O_iError"].Value;

            if (Error == 0)
            {
                MessageBox.Show("Tax is Adjusted");
            }
            if (Error != 0)
            {
                MessageBox.Show("Error No:" + Error1);
            }

            sqlTrans.Commit();
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            sqlTrans.Rollback();
        }

        finally
        {
            con.Close();
        }
    }
}

SQL Server 代码

DECLARE @return_value int,
        @O_iError int

EXEC    @return_value = [dbo].[GP_SOP_AdjustTax]    
        @IN_SOPType = 3,   
        @IN_SOPNo = 'stdinv2278',    
        @IN_AdjustAmount = 0.04,    
        @O_iError = @O_iError OUTPUT

SELECT  @O_iError as N'@O_iError'

SELECT  'Return Value' = @return_value

GO
4

2 回答 2

2

我认为问题是由这条线引起的:

AdjustTax.Parameters.Add("@IN_AdjustAmount", SqlDbType.Int).Value = 0.04;

由于类型是SqlDbType.Int并且您传入 0.04,因此该值很可能四舍五入为 0。没有看到实际存储过程的内容,我只能猜测为该参数传入 0 值会导致存储过程跳过更新,或者存储过程执行的计算导致列被更新为它最初具有的相同值。

我会尝试将该行更改为:

AdjustTax.Parameters.Add("@IN_AdjustAmount", SqlDbType.Decimal).Value = 0.04M

EDIT
DecimalNumericSql 类型的正确映射,如此处所述

于 2012-12-17T06:40:10.037 回答
2

尝试 SqlDbType.Decimal:

AdjustTax.Parameters.Add("@IN_AdjustAmount", SqlDbType.Decimal).Value = 0.04;
于 2012-12-17T06:51:36.170 回答