【发布时间】:2013-09-10 20:40:31
【问题描述】:
我希望讨论更具推测性而不是确定性,因为这个问题本身就是推测性的。它本质上是相当混乱的。
我正在查看使用 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# 代码调用中无效,这似乎很奇怪。
【问题讨论】:
-
这不是与 SQL Server 相关的错误,它表明从数据库返回的值无法编组为您在 DataSet 中使用的 .NET 数据类型。
-
您应该附加 SQL Profiler 并查看代码是否正在执行您假设的 SQL 语句。
-
检查表模式的数据类型,然后将其与您传递或尝试检索的值的数据类型进行比较
标签: c# sql sql-server-2008 stored-procedures