私のC#プロジェクトでは、データベースにDecimal
として保存されているPeriodEnd
を含むEmployee
のデータを取得するためにSQL 2014データベースに対してクエリを実行しています(つまり、2016年11月17日は20161117として保存されます)。私が照会しているデータベースは当社製品ではないので、タイプをDateTime
フィールドに変更することはできません。ここでSQLから返されたSQLDataAdapter値型の変更
は、実行されている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 Serverプロファイラを使用して
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に渡されたクエリがある見ることができます:ここで
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
呼び出しがあります
これをSQLで直接実行すると、結果は次のようになります。
しかし、_sqlDataAdapter
によって作成されたDataTable
の結果は次のとおりです。
は、それが結果にあるように、データ型を使用するSqlDataAdapter
を強制する方法はありますか?または、SQLが実際にDecimal
の代わりにDateTime
オブジェクトを返す可能性があります(PeriodEnd
列はSQLでdecimal(9,0)
と定義されています)。もしそうであれば、これは理由がありますか、それともそれを防止する方法ですか?
「StartDate」はこれと何が関係していますか? – Crowcoder
デバッグするとき、コンパイラはどのような型をしていますか?おそらく、各レコードのその列に対して '.ToString(" yyyyMMdd ")'を実行するだけです。 –
_cmdオブジェクトの作成用のコードを貼り付けることはできますか。特に、コマンドテキストとパラメータ化の作成? – DB101