0

私の C# プロジェクトでは、SQL 2014 データベースに対してクエリを実行して、データベースに として格納されている をEmployee含むデータを取得しています(つまり、2016 年 11 月 17 日は 20161117 として格納されています)。照会しているデータベースは当社の製品ではないため、タイプをフィールドに変更できません。PeriodEndDecimalDateTime

実行中の 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))。もしそうなら、これの理由および/またはそれを防ぐ方法はありますか?

4

2 に答える 2

0

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

于 2016-11-08T15:47:45.170 に答える
0

データセットを作成するときに、データ テーブルに decimal 型の datacolumn を追加して、列の型を明示的に追加してみてください。私の推測では、列の型を明示的に指定していないため、.net は値から派生しています。

于 2016-11-08T14:51:19.633 に答える