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 に答える