0

在我的 C# 项目中,我正在对 SQL 2014 数据库执行查询以检索Employee数据,包括PeriodEnd作为 a 存储在数据库中的 a Decimal(即,2016 年 11 月 17 日存储为 20161117)。我正在查询的数据库不是我们的产品,所以我无法将类型更改为DateTime字段。

这是正在执行的 SQL 脚本:

SELECT DISTINCT
    e.EMPLOYEE as EmpNo,
    ch.PEREND As PeriodEnd,
    ch.PRPOSTSTAT
FROM UPEMPL e
    INNER JOIN UPCHKH ch 
        ON e.EMPLOYEE = ch.EMPLOYEE
WHERE 
    ch.PEREND = @PERIODEND

这是SqlDataAdapter电话:

ExecuteSqlCommandScript(String sqlScript, List<SqlParams> sqlParams)
{
    . . . (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); 

                    SqlResult _result = new SqlResult();
                    _result.DataSet = _dataSet;
                    _result.TableCount = _dataSet.Tables.Count;

                    this.Results.Add(_result);
                }
            }
        }
    }
}

使用 SQL Server Profiler 我可以看到传递给 SQL 的查询是:

exec sp_executesql N'
SELECT DISTINCT
    e.EMPLOYEE as EmpNo,
    ch.PEREND As PeriodEnd,
    ch.PRPOSTSTAT
FROM UPEMPL e
    INNER JOIN UPCHKH ch 
        ON e.EMPLOYEE = ch.EMPLOYEE
WHERE 
    ch.PEREND = @PERIODEND 
',N'@PERIODEND nvarchar(8)',@PERIODEND=N'20161101'

如果我直接在 SQL 中运行它,结果如下:

在此处输入图像描述

但是,DataTable创建的结果_sqlDataAdapter是:

在此处输入图像描述

有没有办法强制SqlDataAdapter使用结果中的数据类型?或者是否有可能 SQL 确实返回了一个DateTime对象而不是 a Decimal(该PeriodEnd列在 SQL 中定义为decimal(9,0))?如果是这样,是否有这样做的原因和/或防止它的方法?

4

2 回答 2

0

尝试在创建数据集时显式添加列类型,方法是将十进制类型的数据列添加到数据表中。我的猜测是,由于您没有明确指定列类型,.net 是从值派生的。

于 2016-11-08T14:51:19.633 回答
0

谢谢大家在这方面的帮助。正是这个建议让我看到了_cmd导致我找到解决方案的对象。有一段代码应该更改数据库以使用数据库ABC。这段代码不能正常工作,所以数据库连接停留在 database 上XYZ。使这个问题难以解决的原因是数据库XYZ定义了从数据库返回数据的视图ABC,但PeriodEnd列是 aDateTime而不是 a decimal。我不知道这些视图,当我看到符合我预期的数据时,我什至没有想过要查看并确保正确分配了数据库。

于 2016-11-08T15:47:45.170 回答