SQLDataAdapter.Fill()抛出将表达式转换为数据类型datetime的算术溢出错误

时间:2016-11-07 15:01:23

标签: c# sql-server sqldataadapter

我有一个自定义方法来处理对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以防万一。

0 个答案:

没有答案