私も同じ問題を抱えており、以前のバージョンの 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 変更ログ