SQLDataAdapter изменяет тип значения, возвращаемый из SQL

В моем проекте на C# я выполняю запрос к базе данных SQL 2014 для извлечения Employee данные, в том числе PeriodEnd который хранится в базе данных как Decimal (т. е. 17 ноября 2016 г. хранится как 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 объект вместо Decimal (PeriodEnd столбец определяется в SQL как decimal(9,0))? Если так, есть ли причина для этого и / или способ предотвратить это?

2 ответа

Попробуйте явно добавить тип столбца при создании набора данных, добавив столбец данных типа decimal в таблицу данных. Я предполагаю, что, поскольку вы явно не указываете тип столбца, .net выводит его из значения.

Спасибо всем за помощь в этом. Это было предложение посмотреть на _cmd объект, который приведет меня к решению. Был кусок кода, который должен был изменить базу данных, чтобы использовать базу данных ABC, Этот фрагмент кода не работал должным образом, поэтому соединение с базой данных осталось в базе данных. XYZ, Что так трудно решить, так это то, что база данных XYZ определенные представления, которые возвращают данные из базы данных ABC, но с PeriodEnd колонка как DateTime и не decimal, Я не знал об этих представлениях, и когда я увидел данные, которые соответствовали моим ожиданиям, я даже не подумал посмотреть и убедиться, что база данных была правильно назначена.

Другие вопросы по тегам