[+/-]
MySQL と .NET
言語の日付時間情報の処理は異なり、MySQL は
'0000-00-00 00:00:00
'
のような、.NET データ
タイプでは表せない日付も使用することができます。適切に処理を行わなければ、この違いによって問題が起きることがあります。
このセクションでは、Connector/NET を使用する場合の、日付時間情報の正しい処理の方法を説明します。
日付の処理の違いは、無効な日付を使用する開発者にとって問題の原因になりえます。無効な
MySQL の日付を、NULL
の日付を含む、ネイティブの .NET
DateTime
オブジェクトにロードすることはできません。
この問題により、無効な日付は
System.ArgumentOutOfRangeException
例外の発生の原因になるので、.NET
DataSet
オブジェクトを
MySqlDataAdapter
クラスの
Fill
メソッドで作成することはできません。
日付の問題に対する最善の解決策は、ユーザの無効な日付の使用を制限することです。これはクライアント側、またはサーバ側で行えます。
クライアント側で無効な日付を制限するのは簡単で、データの処理に常に
.NET DateTime
クラスを使用するだけです。DateTime
クラスは、データベース内の値も有効であることを確認し、有効な日付だけを許可します。この方法の欠点は、それぞれのアプリケーションが独自の日付の発行を行う必要があり、データベースの操作に
.NET および .NET
コードが使われている混合環境での使用が困難な点です。
MySQL 5.0.2
以降のユーザは、無効な日付値の使用を制限する、新しい
traditional
SQL
モードを使用することができます。traditional
SQL
モードの使用に関する情報は、項4.2.6. 「SQL モード」
をご覧ください。
.NET
アプリケーションでの無効な日付の使用は避けることが推奨されますが、MySqlDateTime
データタイプを用いて無効な日付を使用することは可能です。
MySqlDateTime
データタイプは、MySQL
サーバでサポートされている日付値と同じものを適用しています。Connector/NET
のデフォルト動作は、.NET DateTime
オブジェクトを有効な日付値に戻し、エラーを無効な日付に返します。このデフォルトは、Connector/NET
が無効な日付に MySqlDateTime
オブジェクトを返すように改変できます。
無効な日付に MySqlDateTime
を返すよう Connector/NET
に指示するには、次のラインを接続ストリングに追加してください
:
Allow Zero Datetime=True
MySqlDateTime
クラスの使用には、依然として問題があることに注意してください。以下は既知の問題の一部です
:
無効な日付のデータ構築は依然、エラーの原因になります ( 0000-00-00 などのゼロの日付ではこの問題は起こらない模様 ) 。
ToString
メソッドは、標準の
MySQL
の形式でフォーマットされた日付を戻します
( 例えば、2005-02-23 08:50:25
)
。これは、.NET DateTime クラスの
ToString
動作とは異なるものです。
MySqlDateTime
クラスは NULL
の日付をサポートし、.NET DateTime
クラスはこれをサポートしません。この差により、MySQLDateTime
を DateTime に変換する時、最初に NULL
を確認しておかなければエラーが発生します。
これは既知の問題であるため、有効な日付のみをアプリケーションで使用するのが最善の方法になります。
.NET DateTime
データタイプは、NULL
値を処理することができません。そのため、クエリから
DateTime
変数に値を設定する時、最初に値が
NULL
かどうかを確認する必要があります。
MySqlDataReader
を使用している時、設定の前に
.IsDBNull
メソッドを使って、値が
NULL
か確認してください。
Visual Basic 例 :
public System.Data.ConnectionState State {get;}
C# 例 :
Public ReadOnly Property UseCompression As Boolean
NULL
値はデータセット内で作用し、特別な処理なしで結合してコントロールを形成することが可能です。