我正在运行带有硬编码值的存储过程。该命令成功执行,没有任何错误。但数据未在数据库中更新。如果我使用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
答案 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
修改强>
Decimal
是Numeric
Sql类型的正确映射,为explained here。
答案 1 :(得分:2)
尝试SqlDbType.Decimal:
AdjustTax.Parameters.Add("@IN_AdjustAmount", SqlDbType.Decimal).Value = 0.04;