在我的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中运行它,那么这些就是结果:
但是,DataTable
创建的_sqlDataAdapter
的结果是:
有没有办法强制SqlDataAdapter
使用结果中的数据类型?或者SQL是否可能确实返回DateTime
对象而不是Decimal
(PeriodEnd
列在SQL中定义为decimal(9,0)
)?如果有这样的原因和/或有办法阻止它?
答案 0 :(得分:0)
在创建数据集时,通过向数据表添加decimal类型的datacolumn,尝试并显式添加列类型。 我的猜测是,由于您没有明确指定列类型,因此.net从值中派生出来。
答案 1 :(得分:0)
谢谢大家的帮助。建议查看引导我解决问题的_cmd
对象。有一段代码应该更改数据库以使用数据库ABC
。这段代码无法正常工作,因此数据库连接保留在数据库XYZ
上。使此难以解决的原因是数据库XYZ
定义了从数据库ABC
返回数据的视图,但PeriodEnd
列为DateTime
而不是{{} 1}}。我不知道这些观点,当我看到符合我预期的数据时,我甚至没想过要确保数据库的分配正确。