2012-12-17 51 views
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 
+1

请证实有关即@IN_AdjustAmount – TechDo

+0

感谢答复第三个输入参数的DB int类型。类型是numaric – Kavitha

+0

如果类型是numaric ..那么哪种类型有我设置在C#代码。 – Kavitha

回答

2

我认为这个问题是由这一行造成的:

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

由于类型为SqlDbType.Int,你是路过在0.04中,该值最有可能四舍五入为0.没有看到实际存储过程的内容edure,我只能猜测,为该参数传递值为0或者导致存储过程跳过更新,或者存储过程确实会导致列中的计算结果更新为原来的相同值。

我会尝试改变该行:

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

编辑
Decimal对于Numeric SQL类型正确映射,如explained here

+0

让我知道你为什么包括'M'(0.04M)。 – Kavitha

+0

'M'只是意味着'小数'。请参阅此处:http://msdn.microsoft.com/en-us/library/364x0z75(v=vs.100).aspx – rsbarro

2

尝试SqlDbType.Decimal:

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