- PR -

MySQL+VB.NET+ODBC接続で特定のレコードでエラーになる

1
投稿者投稿内容
赤いんげん
会議室デビュー日: 2006/08/29
投稿数: 10
お住まい・勤務地: 東京都
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)