为什么此存储过程不更新数据库中的数据?

时间:2012-12-17 06:17:36

标签: c# sql stored-procedures

我正在运行带有硬编码值的存储过程。该命令成功执行,没有任何错误。但数据未在数据库中更新。如果我使用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

2 个答案:

答案 0 :(得分: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

修改
DecimalNumeric Sql类型的正确映射,为explained here

答案 1 :(得分:2)

尝试SqlDbType.Decimal:

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