我有一个自定义方法来处理对SQL的调用,该方法接收脚本和SqlParamaters
列表,执行SQL,然后通过DataSet
填充SqlDataAdapter
任何结果。这已经在各种项目上使用了3年多而没有问题。
以下是调用自定义方法的代码片段(实际的SQL脚本存储在文件中):
using (SQLClass _sql = new SQLClass(_Config.DatabaseInfo))
{
FileInfo _file = new FileInfo("\\scripts\\GetEmployeeTable.sql");
List<SqlParameter> _sqlParams = new List<SqlParameter>();
// Convert DateTime to Decimal
_sqlParams.Add(new SqlParameter("PERIODEND", DateToDecimal(periodEnd)));
_sql.ExecuteSqlCommandScript(_file, _sqlParams);
}
private Decimal DateToDecimal(DateTime myDate)
{
Decimal _periodEndDecimal;
String _periodEndString = myDate.ToString("yyyyMMdd");
if (Decimal.TryParse(_periodEndString, out _periodEndDecimal))
return _periodEndDecimal;
return 0;
}
以下是自定义方法:
ExecuteSqlCommandScript(FileInfo file, List<SqlParams> sqlParams)
{
. . . (get _sqlScript by reading info from 'file')
. . . (setup SqlConnection info)
using (SqlConnection _conn = new SqlConnection(connectionString))
{
using (SqlCommand _cmd = new SqlCommand())
{
_cmd.CommandText = sqlScript;
_cmd.Connection = _conn;
_cmd.Connection.Open();
// add SqlParameters to SQL command
if (sqlParams != null)
{
_cmd.Parameters.AddRange(sqlParams.ToArray());
}
using (SqlDataAdapter _sqlDataAdapter = new SqlDataAdapter(_cmd))
{
try
{
// Save Table info to Results object
DataSet _dataSet = new DataSet();
_sqlDataAdapter.Fill(_dataSet); <!-- program falls into catch block here
SqlResult _result = new SqlResult();
_result.DataSet = _dataSet;
_result.TableCount = _dataSet.Tables.Count;
this.Results.Add(_result);
}
}
}
}
}
我现在正在更新旧项目以使用此方法查询将日期存储为Decimal
类型的员工表(即,12/25/2016存储在SQL中为21061225)。这是我们整合的其他公司/产品的表格,因此我无法将此列更改为DateTime
。
这是我正在执行的脚本:
SELECT ch.EMPLOYEE
FROM UPCHKH ch
WHERE ch.PEREND = @PERIODEND
旧代码使用SqlDataReader
来检索结果,此脚本将成功执行。当我使用自定义过程运行此脚本时(使用SqlDataAdapter
),我收到此错误:
错误:将表达式转换为数据类型的算术溢出错误 日期时间。
我通过SQL Server Profiler跟踪此调用,这是对SQL的实际调用:
exec sp_executesql N'
SELECT ch.EMPLOYEE
FROM UPCHKH ch
WHERE
ch.PEREND = @PERIODEND
',N'@PERIODEND decimal(8,0)',@PERIODEND=20161101
如果我将这个确切的脚本复制到SQL窗口并运行它,我会得到预期的结果。
那么,SqlDataAdapter
是否正在为SQL调用或从SQL返回的结果做些什么?上面的自定义方法在标识的行上失败。我们正在使用.NET 4.5和SQL 2014以防万一。