SQL Update命令无法使用c#代码

时间:2012-02-20 07:11:42

标签: c# sql-server

我知道这个问题已被多次询问,我读了那些没有运气的问题:(所以我再次问我的代码。

我创建了一个存储过程来更新数据库表。

存储过程:

CREATE PROCEDURE usp_PettyCash_EditExpenseInfo 
(
    @ExpenseID bigint,
    @ExpenseName varchar(100),
    @SAPCode varchar(50),
    @MaxLimit decimal,
    @ExpenseType varchar(50)
)
AS
BEGIN 
    UPDATE t_ExpenseInfo 
    SET ExpenseName = @ExpenseName, 
        SAPCode = @SAPCode,       
        MaxLimit = @MaxLimit, 
        ExpenseType = @ExpenseType 
    WHERE 
        ExpenseID = @ExpenseID
END 
GO

但是当我从代码后面用下面的代码调用它时,它给出了与

类似的异常
  

从nvarchar转换为bigint时出错

代码背后:

oOleDbCommand.Parameters.AddWithValue("@ExpenseName", oInputExpense.ExpenseName.ToString());
oOleDbCommand.Parameters.AddWithValue("@SAPCode", oInputExpense.SAPCode.ToString());
oOleDbCommand.Parameters.AddWithValue("@MaxLimit", Convert.ToDecimal(oInputExpense.MaxLimit));
oOleDbCommand.Parameters.AddWithValue("@ExpenseType", oInputExpense.ExpenseType.ToString());
oOleDbCommand.Parameters.AddWithValue("@ExpenseID", Convert.ToDouble(oInputExpense.ExpenseID.ToString()));

我也试过这个:

oOleDbCommand.CommandText = "UPDATE t_ExpenseInfo SET ExpenseName='" + oInputExpense.ExpenseName.ToString() + "', SAPCode='" + oInputExpense.SAPCode.ToString() + "', MaxLimit=" + oInputExpense.MaxLimit + ", ExpenseType='" + oInputExpense.ExpenseType.ToString() + "' WHERE ExpenseID=" + oInputExpense.ExpenseID + "";

这个DIRECT命令从SQL查询分析器运行正常来自后面的代码也会出现“访问冲突”错误。

我真的很困惑该怎么办?请帮忙!

4 个答案:

答案 0 :(得分:3)

是否有任何特殊原因可以使用OleDbCommand而不是“本机”SQL Server SqlCommand

我会试试这个:

using(SqlConnection conn = new SqlConnection("(add your connection string here)"))
using(SqlCommand cmd = new SqlCommand("dbo.usp_PettyCash_EditExpenseInfo", conn))
{
   cmd.CommandType = CommandType.StoredProcedure;

   // add parameters with defined type!
   cmd.Parameters.Add("@ExpenseID", SqlDbType.BigInt).Value = .....;
   cmd.Parameters.Add("@ExpenseName", SqlDbType.VarChar, 100).Value = ".....";
   cmd.Parameters.Add("@SAPCode", SqlDbType.VarChar, 50).Value = ".....";
   cmd.Parameters.Add("@MaxLimit", SqlDbType.Decimal, 15, 2).Value = 100.00;
   cmd.Parameters.Add("@ExpenseType", SqlDbType.VarChar, 50).Value = "......";

   // open connection, call stored procedure, close connection
   conn.Open();
   cmd.ExecuteNonQuery();
   conn.Close();
}

基本上,我更喜欢使用原生的SqlConnection/SqlCommand而不是旧的,传统的OleDb,我也更喜欢显式指定我的参数是什么类型 - 不依赖于ADO。 NET或其他一些自动计算出来的部分 - 当它必须猜测时,它可能会出错,并且会出现错误,就像您看到的那样。如果你自己定义它,你就掌控了!

答案 1 :(得分:1)

尝试使用Convert.ToInt64(...)而不是Convert.ToDouble(oInputExpense.ExpenseID.ToString())

答案 2 :(得分:1)

我在SQL事件探查器中收集查询并发现OleDB不关心参数的名称,但它关心给定参数的顺序。 在您的情况下,ExpenseName作为第一个参数给出,并尝试将其转换为ExpenseId(存储过程中的第一个参数)。

以下是来自SQL事件探查器的查询:

exec usp_PettyCash_EditExpenseInfo N'ExpenseName',N'SAP',21.209999084472656,N'a',1

尝试更改给定参数的顺序。我希望它有所帮助。

答案 3 :(得分:0)

目前我正在使用第一部分。但我检查了两个都在工作:)

OleDbCommand.Parameters.Add("@ExpenseID", OleDbType.BigInt).Value = Convert.ToInt64(oInputExpense.ExpenseID);
OleDbCommand.Parameters.Add("@ExpenseName", OleDbType.VarChar).Value = Convert.ToString(oInputExpense.ExpenseName);
OleDbCommand.Parameters.Add("@SAPCode", OleDbType.VarChar).Value = Convert.ToString(oInputExpense.SAPCode);
OleDbCommand.Parameters.Add("@MaxLimit", OleDbType.Decimal, 2).Value = Convert.ToDecimal(oInputExpense.MaxLimit);
OleDbCommand.Parameters.Add("@ExpenseType", OleDbType.VarChar).Value = Convert.ToString(oInputExpense.ExpenseType);

//OleDbCommand.Parameters.AddWithValue("@ExpenseID", Convert.ToInt64(oInputExpense.ExpenseID.ToString()));
//OleDbCommand.Parameters.AddWithValue("@ExpenseName", oInputExpense.ExpenseName.ToString());
//OleDbCommand.Parameters.AddWithValue("@SAPCode", oInputExpense.SAPCode.ToString());
//OleDbCommand.Parameters.AddWithValue("@MaxLimit", Convert.ToDecimal(oInputExpense.MaxLimit));
//OleDbCommand.Parameters.AddWithValue("@ExpenseType", oInputExpense.ExpenseType.ToString());