我希望讨论更具推测性而不是确定性,因为这个问题本身就是推测性的。它本质上是相当混乱的。
我正在查看Microsoft.Practices.EnterpriseLibrary
用于 SQL Server 数据访问的 .NET 4.0 C# 代码。
该代码调用一个在 SQL Server Management Studio 中运行良好的存储过程并返回结果。问题是,当从 C# 端调用该过程时,会引发异常。
违规代码如下:
Database _db = DatabaseFactory.CreateDatabase(instance_name);
string _sql = "[dbo].[usp_stored_procedure]";
DbCommand _cmd = _db.GetStoredProcCommand(_sql);
/* _db.AddInParameter calls to supply parameters */
DataSet _ds = _db.ExecuteDataSet(_cmd);
最后一行抛出一个异常,它说:
将 int 转换为数据类型 numeric 的算术溢出错误。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection)
....
在 System.Data.SqlClient.SqlDataReader.Read()
....
在 System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping 映射)
....
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteDataSet(DbCommand 命令)....
在 DataAccess.call_stored_procedure(字符串 instance_name,int?_client_id,int?_client_group_id,int?_event_type_id,DateTime _start_date,DateTime _end_date,int?_employee_type_id,int?_survey_id,int?_ro_date)
我省略了(我认为的)不必要的堆栈跟踪,以及引发异常的函数。参数按该顺序提供,并且类型精确匹配。
存储过程中有 的用法Decimal(18, 10)
,并且存储过程与以前的一组数据一起使用(在 C# 端也是如此)它对新的数据供应产生了问题。
我的“问题”是这种行为是否是一个已知问题,或者从哪里开始寻找。在 SQL Server Management Studio 中起作用的东西在 C# 代码调用中不起作用,这似乎很奇怪。