3

質問のタイトルは明確ではありませんが、この問題は次の説明で非常に明確です。

BirthDayCREATE TABLE クエリで datetime として宣言されたフィールドがあります。次のクエリがあり、次のように DataTable に入力する場合、このフィールドを呼び出します。

SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT BirthDay FROM myTable", myConnection);
DataTable dt = new DataTable();
da.Fill(dt);
myDataGridView.DataSource = dt;

の列BirthDaymyDataGridViewは のタイプがDateTimeあり、 で確認でき myDataGridView.Columns["BirthDay"].ValueTypeます。

ただし、次のように SELECT クエリを少し変更すると:

SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT CASE WHEN 1 THEN BirthDay END AS BirthDay2 FROM myTable", myConnection);

DataTable に入力し、myDataGridView にバインドした後、BirthDay2列も のタイプであると予想しました。DateTimeただし、タイプはSystem.Object?

試してみましCAST(... as DATETIME)たが、返される型はSystem.Int64(SQLite の DATETIME が実際にInt64は .NET に対応することを理解しています)、どうすればSystem.DateTime元の column として返すことができるのでしょうかBirthDay

最終的な型 ( で確認できますDataGridViewColumn.ValueType) が必要なので、日時文字列を希望どおりにフォーマットDateTimeするために使用できます。DataGridViewColumn.Format

あなたの助けは非常に高く評価されます!

4

1 に答える 1

0

私たちのチームは、この問題を長い間研究してきました。私たちの最終的な結論は、ソース フィールドをラップする式は、ソース データ型を使用できなくするということです。ADO.NET プロバイダーの場合、式を使用するとSystem.Object最終型になり、ODBC プロバイダーの場合はSystem.String型になります。したがって、使用するデータプロバイダーに完全に依存します。なぜこのように動作するのかは、データ プロバイダーの開発者に対する質問です (答えは見つかりませんでした)。ところで、.NET Framework には、指定された値が期待される型であるかどうかをテストするためのさまざまなツールが用意されています。SQLite 3 には 5 つの基本データ型 (NULL、INTEGER、REAL、TEXT、BLOB) しかありません。したがって、.NET コードでは、最も一般的な 3 つの型 (INTEGER、REAL、TEXT) のテストを通じて値を渡すことができます。

于 2013-07-15T11:01:36.777 に答える