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
, Я не знал об этих представлениях, и когда я увидел данные, которые соответствовали моим ожиданиям, я даже не подумал посмотреть и убедиться, что база данных была правильно назначена.