- - PR -
MySQL+VB.NET+ODBC接続で特定のレコードでエラーになる
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-08-29 00:11
はじめまして。MySQL+VB.NET+ODBC接続で1週間程度行き詰まっております。
1.エラーの事象 ネットワーク経由でデータを受信後に、パラメータクエリへそのデータを設定し、 ODBC経由でMySQLにInsert文を発行していますが、特定のレコードで 以下のようなエラーメッセージが出力されて、Insert処理が失敗します。 ERROR [23000] [MySQL][ODBC 3.51 Driver][mysqld-5.0.18-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'C','18','1999100878','マイネルアムンゼン')' at line 1 ERROR [23000] [MySQL][ODBC 3.51 Driver][mysqld-5.0.18-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'C','18','1996110282','アドマイヤカイザー','2000111803040711','福島記念','福島記・ at line 1 ERROR [23000] [MySQL][ODBC 3.51 Driver][mysqld-5.0.18-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'C','18','2002102310','トップガンジョー','2005100905040211','毎日王冠','毎日王冠'' at line 1 2.環境 2.1 動作環境 Windows2000pro + MySQL5.0 + VB.NET2005 + ODBC (MySQLはローカルで動かしています。) 2.2 DBの文字コード設定(MySQL5.0) Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis [mysqld]に「skip-character-set-client-handshake」を追加 2.3 DBの定義 CREATE TABLE KISYU ( 〜途中略〜 KisyuCode CHAR(5) PRIMARY KEY, 〜途中略〜 SaikinJyusyo3GradeCD CHAR(1), SaikinJyusyo3SyussoTosu CHAR(2), SaikinJyusyo3KettoNum CHAR(10), SaikinJyusyo3Bamei CHAR(36)); 2.4 ConnectionStringの設定 ConnectionStr = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;PORT=3306;DATABASE=keiba; UID=xxxx;PASSWORD=yyyyyy;OPTION=3" 2.5 パラメータクエリ sql = "Insert into KISYU (〜略〜,kisyuCode,〜略〜,saikinJyusyo3GradeCD,saikinJyusyo3SyussoTosu,saikinJyusyo3KettoNum,saikinJyusyo3Bamei) values (" sql = sql & "?,?,?,?,?,?,?,?,?,?〜略〜?" sql = sql & ")" cmd = New OdbcCommand(sql, con) 〜途中略〜 cmd.Parameters.Add("@saikinJyusyo3GradeCD" , OdbcType.VarChar).Value = info.saikinJyusyo3GradeCD cmd.Parameters.Add("@saikinJyusyo3SyussoTosu" , OdbcType.VarChar).Value = info.saikinJyusyo3SyussoTosu cmd.Parameters.Add("@saikinJyusyo3KettoNum , OdbcType.VarChar).Value = info.saikinJyusyo3KettoNum cmd.Parameters.Add("@saikinJyusyo3Bamei , OdbcType.VarChar).Value = info.saikinJyusyo3Bamei 'コマンド実行 cmd.ExecuteNonQuery() 3.問題の解析 3.1 事象の再現性 等 A.全部で168レコードをInsertしたところ、3レコードでエラーが発生。 B.MySQL Query Browserからエラーレコードと同一内容のSQLを発行したら、正常にInsertが完了した。 C.MySQL4.0.18へDBを変更しても全く同じレコード位置で同じエラーが再現した。 D.DBをSQLserver2000へ変更したら、全て正常に処理が完了した。 E.DBをACCESS2000へ変更したら、B.と同様に全レコード正常に処理が完了した。 F.エラーが発生した時点でパラメータの内容をダンプしても文字化けは発生していない(ように見える)。 System.Diagnostics.Debug.WriteLine(j & "|" & ImportObj.cmd.Parameters.Item(j).Value & "|") ↓出力内容 63|C| 64|18| 65|1999100878| 66|マイネルアムンゼン| G.他のレコードで、「C,18,2000104000,メモリーキアヌ」の並びでInsertが成功している。 3.2 勝手な推測 当初、文字コード変換エラーを疑ったのですが、「表」とかの文字が入っているわけではなく、 またダンプ内容も文字化けをしていないので、違う原因かと考えています。 「C'〜'」が何かのコード値や16進数を表すためエラーになっているかと思ったものの、 同様のレコードでInsertが成功しているものもあり、これも腑に落ちません。 何かヒントでも良いので、お力をお貸し頂けないでしょうか。 よろしくお願いいたします。 |
1