2016-11-08 10 views
0

私の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で直接実行すると、結果は次のようになります。

enter image description here

しかし、_sqlDataAdapterによって作成されたDataTableの結果は次のとおりです。

enter image description here

は、それが結果にあるように、データ型を使用するSqlDataAdapterを強制する方法はありますか?または、SQLが実際にDecimalの代わりにDateTimeオブジェクトを返す可能性があります(PeriodEnd列はSQLでdecimal(9,0)と定義されています)。もしそうであれば、これは理由がありますか、それともそれを防止する方法ですか?

+0

「StartDate」はこれと何が関係していますか? – Crowcoder

+0

デバッグするとき、コンパイラはどのような型をしていますか?おそらく、各レコードのその列に対して '.ToString(" yyyyMMdd ")'を実行するだけです。 –

+1

_cmdオブジェクトの作成用のコードを貼り付けることはできますか。特に、コマンドテキストとパラメータ化の作成? – DB101

答えて

0

datatableにデータ型にdecimal型のdatacolumnを追加して、明示的に列型を追加してください。 私は、あなたが明示的に列の型を指定していないので、.netがその値から派生していると思います。

+0

いいえ。データアダプタは、SQL Serverから返された型から型を派生します。常にそのようなタイプがあります。 'VARCHAR'や' DECIMAL'や 'DATETIME'でもかまいませんが、.NETを推測することは決してありません。あなたが言っていることはパラメータに適用されます - タイプが指定されていない場合、.NETは渡すオブジェクトのタイプからSQLタイプを派生させる必要があります。 –

+0

これを紹介してくれてありがとう@Jeroen Mostert – Swetha

0

ありがとうございました。解決策につながった_cmdオブジェクトを見ることを提案しました。 ABCデータベースを使用するようにデータベースを変更する予定のコードがありました。このコードは正常に動作していなかったため、データベース接続はデータベースXYZにとどまっていました。これを解決することが難しくなったのは、データベースXYZには、ABCのデータが返され、PeriodEndの列はDateTimeで、decimalではなく、返されるビューが定義されています。私はこれらの意見について知らなかったし、私が期待したものと一致するデータを見たとき、私は見て、データベースが正しく割り当てられていることを確認することさえ考えなかった。

関連する問題