2

IIS 内でホストされている ac# Web サービスを実行している場合、MySQL ドライバー 5.1.10 を使用すると完全に動作しますが、最新のドライバー 5.2 に更新すると、次のエラーが発生します。

ERROR [HY000] [MySQL]ODBC 5.2(w) Driver][mysqld-5.5.28-log]Incorrect datetime value:      '2012-12-14 14:01:13.553000000' for column 'Date' at row 1

システム DSN を使用しています。

Windows 7 で MySQL サーバー バージョン 5.5 x64 を実行していますが、値を保存しようとしているデータ型は、エラー メッセージに示されているように DateTime です。他の誰かがこの問題に遭遇しましたか?

4

1 に答える 1

1

私も同じ問題を抱えており、以前のバージョンの ODBC コネクタ (5.1.10 以前) では、C# の DateTime フィールドの処理が大きく異なっているようです。コネクタの以前のバージョンでは、MySQL で動作するように十分な DateTime を切り捨てただけでしたが、現在のバージョンではより多くの小数データが​​保持されている可能性があります。

Decimalまた、説明的なエラー メッセージが表示されずにコネクタが完全にクラッシュする変数の奇妙な動作にも気付きました。そのための私の解決策は、Double代わりに型を使用することでした。

編集ODBC/Connector v5.1.11 でしばらく前に見た変更ログ を見つけDateTime、バグ修正リストの値の異なる処理を確認しました。

SQLBindParameter および SQL_C_TIMESTAMP 型を使用する準備済みステートメントで、タイムスタンプの小数秒部分が無視されました。たとえば、小数部分だけが異なる 2 つのタイムスタンプ値を比較する準備済みクエリは、値が同一であると見なします。(バグ #12767761、バグ #60648)

おもしろいことに、MySQL 5.6.4まではDATETIME および TIMESTAMP フィールドの精度は秒単位 (ミリ秒やマイクロ秒ではありません) までしかなかったため、以前のバージョンのコネクタの「正しくない」動作は小数秒を無視し、MySQL は満足していました。コネクタが小数データを無視しないようになったため、このデータがストアド プロシージャまたはプリペアド ステートメントを介して渡されると、エラーが生成されます。したがって、当面の解決策は次のいずれかです。

1) MySQL 5.6への更新(現在は GA です)

2)巧妙な手法DateTimeを使用して、型とその他のすべての属性を維持しながら、 a から小数データを取り除きます。

DateTime dt = DateTime.Now //Or any existing DateTime value
dt = dt.AddTicks( - (dt.Ticks % TimeSpan.TicksPerSecond));

3) C# と型のニュアンスをまったく扱いたくない場合DateTime、およびデータベースで作業するときに文字列データを使用することの潜在的なセキュリティ上の影響を認識している場合は、常に独自の日付文字列を作成するか、次のToString方法を使用できます。 aDateTimeを入力して、文字列を MySQL に渡します。

// convert DateTime to string with formatting for MySQL
string dateformysql = mydatetime.ToString("yyyy-MM-dd HH:mm:ss");

参考文献:
.NET DateTime からミリ秒を切り捨てる方法
なぜ MySQL はミリ秒 / マイクロ秒の精度をサポートしないのですか?
ODBC コネクタ 5.1.11 変更ログ

于 2013-02-06T10:28:53.397 に答える