2010-08-08 60 views
0

我有錯誤「的錯誤數據類型爲nvarchar轉換爲十進制」 當呼叫存儲過程調用從C#另一個存儲過程作爲調用一個存儲的程序,由另一個在C#

cmd = new SqlCommand("tax_Base_emp", con); 
cmd.CommandType = CommandType.StoredProcedure; 
parm1 = new SqlParameter("@emp_code", SqlDbType.BigInt); 
parm1.Value = emp_code; 
parm1.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm1); 
parm2 = new SqlParameter("@co_id", SqlDbType.BigInt); 
parm2.Value = Settings.Default.comp_id; 
parm2.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm2); 
parm3 = new SqlParameter("@d", SqlDbType.DateTime); 
parm3.Value = Convert.ToDateTime("31/1/2010"); 
parm3.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm3); 
parm4 = new SqlParameter("@y", SqlDbType.Int); 
parm4.Value =int.Parse(textBox2.Text); 
parm4.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm4); 
parm5 = new SqlParameter("@check_month", SqlDbType.Int); 
parm5.Value =1; 
parm5.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm5); 
parm6 = new SqlParameter("@month", SqlDbType.Int); 
parm6.Value =8; 
parm6.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm6); 
SqlParameter parm7 = new SqlParameter("@indate", SqlDbType.DateTime); 
parm7.Value = Convert.ToDateTime("8/5/2010"); 
parm7.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(parm7); 
SqlParameter parm8 = new SqlParameter("@Sumtotal", SqlDbType.Decimal); 
parm8.Scale = 2; 
parm8.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(parm8); 
con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close(); 
decimal tax_value = Convert.ToDecimal(cmd.Parameters["@Sumtotal"].Value); 

並稱爲存儲proecdure:

ALTER PROCEDURE Tax_Base_emp 
    @emp_code bigint, 
    @co_id bigint, 
    @d datetime, 
    @y int, 
    @check_month int, 
    @month int, 
    @indate datetime, 
    @Sumtotal decimal(8,2) output 

AS 
declare @tax_main_sal decimal(8,2) 
declare @tax_var_sal decimal(8,2) 
declare @salary decimal(8,2) 
declare @insh_varsalary decimal(8,2) 
declare @insh_value decimal(8,2) 
declare @vacation_value decimal(8,2) 
declare @vacation_varsalary decimal(8,2) 
declare @ded_value decimal(8,2) 
declare @ben_value decimal(8,2) 


exec Taxable_mainsalary @emp_code,@co_id,@tax_main_sal output 
exec taxable_varsalary @emp_code,@co_id, @tax_var_sal output 
----taxableSalary--------------- 
set @[email protected][email protected]_var_sal 
----insurance------------------- 
exec varsalary_insh @emp_code,@co_id,@d,@y, @insh_varsalary output 
exec insh_no @emp_code,@co_id,@insh_varsalary,@check_month, @insh_value output 
----vacation-------------------- 
exec vacation_varsalary @emp_code,@co_id,@vacation_varsalary output 
exec vacation_value @emp_code,@co_id,@y,@month,@vacation_varsalary,output 
---------deduction--------------- 
exec deduction_for_tax @emp_code,@co_id,@indate,@ded_value output 
-------------benifit------------ 
exec benfit_for_tax @emp_code,@co_id,@indate,@ben_value output 
-----------------------------------NetSalary-------------------------------------------------------- 
set @Sumtotal=(isnull(@salary,0)+isnull(@ben_value,0))-(isnull(@insh_value,0)+isnull(@vacation_value,0)+isnull(@ded_value,0)) 
return 
+0

哪裏是你的C#? – Oded 2010-08-08 11:06:23

+1

如果您在諸如Sql Server Management Studio等手動方式手動調用存儲過程'Tax_Base_emp'並傳遞將在應用程序中輸入的值,那麼存儲過程是否可以工作? – Rob 2010-08-08 11:17:31

+0

storced程序工作在sql管理工作室,但問題時,我從c# – shmandor 2010-08-08 11:28:07

回答

0

我看不到任何內容會導致您發佈的代碼。

我懷疑這個錯誤是在你正在調用的8個存儲過程之一中,你將一個nvarchar分配給一個小數。

我會暫時將這些註釋掉,只是返回一個虛擬數字,如果修復了它,請取消註釋並重試一次。如果錯誤再次出現,那麼您知道它出現在您剛剛取消註釋的錯誤中。即進行二分查找以找到違規程序。

3

我沒有看到你的C#代碼有什麼問題 - 真的很難說什麼會導致問題。你的C#代碼只是簡單地調用一個存儲過程 - 這真的不應該是個問題。

不過,我對你的編碼風格幾點建議:

  • 把你SqlConnectionSqlCommandusing(....) { .... }塊,使你的代碼更可靠
  • 儘量避免指定默認屬性值,像Direction = ParameterDirection.Input;一遍又一遍地; .Input是默認值 - 只有當您偏離該默認值時纔會指定它,如果您反覆執行相同的步驟 - 爲什麼不把它放在方法中並調用該方法幾次? ?這也使您不必創建SqlParameter對象,你那麼就扔掉的一個極大.....

你最終的東西,如:

public void CallStoredProc() 
{ 
    using(SqlConnection con = new SqlConnection(.....)) 
    using(SqlCommand cmd = new SqlCommand("tax_Base_emp", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     AddParameter(cmd.Parameters, "@emp_code", SqlDbType.BigInt, emp_code); 
     AddParameter(cmd.Parameters, "@co_id", SqlDbType.BigInt, comp_id); 
     AddParameter(cmd.Parameters, "@d", SqlDbType.DateTime, Convert.ToDateTime("31/1/2010")); 
     AddParameter(cmd.Parameters, "@y", SqlDbType.Int, int.Parse(textBox2.Text)); 
     AddParameter(cmd.Parameters, "@check_month", SqlDbType.Int, 1); 
     AddParameter(cmd.Parameters, "@month", SqlDbType.Int, 8); 
     AddParameter(cmd.Parameters, "@indate", SqlDbType.DateTime, Convert.ToDateTime("8/5/2010")); 

     AddOutputParameter(cmd.Parameters, "@Sumtotal", SqlDbType.Decimal, 8, 2); 

     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 

     decimal tax_value = Convert.ToDecimal(cmd.Parameters["@Sumtotal"].Value); 
    } 
} 

public void AddParameter(SqlParameterCollection params, string name, SqlDbType type, object value) 
{ 
    SqlParameter tmpParam = new SqlParameter(name, type); 
    tmpParam.Value = value; 
    params.Add(tmpParam); 
} 

public void AddOutputParameter(SqlParameterCollection params, string name, SqlDbType type, int precision, int scale) 
{ 
    SqlParameter tmpParam = new SqlParameter(name, type); 
    tmpParam.ParameterDirection = Direction.Output; 
    tmpParam.Precision = precision; 
    tmpParam.Scale = scale; 
    params.Add(tmpParam); 
} 
相關問題