私の C# プロジェクトでは、SQL 2014 データベースに対してクエリを実行して、データベースに として格納されている をEmployee
含むデータを取得しています(つまり、2016 年 11 月 17 日は 20161117 として格納されています)。照会しているデータベースは当社の製品ではないため、タイプをフィールドに変更できません。PeriodEnd
Decimal
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)
)。もしそうなら、これの理由および/またはそれを防ぐ方法はありますか?