SQLDataAdapter更改从SQL返回的值类型

时间:2016-11-08 13:37:38

标签: c# sql-server sqldatadapter

在我的C#项目中,我正在针对SQL 2014数据库执行查询以检索Employee数据,包括PeriodEnd,其作为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中运行它,那么这些就是结果:

enter image description here

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

enter image description here

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

2 个答案:

答案 0 :(得分:0)

在创建数据集时,通过向数据表添加decimal类型的datacolumn,尝试并显式添加列类型。 我的猜测是,由于您没有明确指定列类型,因此.net从值中派生出来。

答案 1 :(得分:0)

谢谢大家的帮助。建议查看引导我解决问题的_cmd对象。有一段代码应该更改数据库以使用数据库ABC。这段代码无法正常工作,因此数据库连接保留在数据库XYZ上。使此难以解决的原因是数据库XYZ定义了从数据库ABC返回数据的视图,但PeriodEnd列为DateTime而不是{{} 1}}。我不知道这些观点,当我看到符合我预期的数据时,我甚至没想过要确保数据库的分配正确。