我知道这个问题已被多次询问,我读了那些没有运气的问题:(所以我再次问我的代码。
我创建了一个存储过程来更新数据库表。
存储过程:
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查询分析器运行正常来自后面的代码也会出现“访问冲突”错误。
我真的很困惑该怎么办?请帮忙!
答案 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());