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

标签 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

最佳答案

我认为问题是由这一行引起的:

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 .

关于c# - 为什么此存储过程不更新数据库中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13909230/

相关文章:

asp.net - ASP.NET –数据库存储过程中的错误处理

c# - 如何使用旧的 MS Sans Serif 字体

c# - 在c#中将日期转换为刻度(用于表存储查询)

Delphi XE 中 TClientDataSet(CDS 文件)的 SQL 查询?

sql - 使用 SELECT 语句查询自定义 postgresql 参数

Sql,触发函数而不是简单的约束

mysql - 循环遍历 information_schema mysql 的结果

c# - 使用 Visual Studio 2012 平板电脑模拟器模拟无网络

c# - 评估数学表达式的最佳算法?

sql - 自动将调用过程的结果放入 select 语句中