[前][次][番号順一覧][スレッド一覧]

mysql:5002

From: 前田 剛 <前田 剛 <maeda@xxxxxxxxxx>>
Date: Mon, 21 Jan 2002 21:25:31 +0900
Subject: [mysql 05002] Re: sjis サーバの BLOB 項目に画像を登録 ( たぶん解決)

 前田@ワコムアイティです。
 高橋さん、レスありがとうございました。


On Fri, 18 Jan 2002 02:25:45 +0900
"TAKAHASHI, Tomohiro" <t_takahashi@xxxxxxxxxx> wrote:

>   TSQLClientDataSet の BeforeUpdateRecordイベントハンドラなどを使う
> ことで、データを変更前に適切に書き換えることで対処はできないでしょ
> うか? 

 上記の方法を少し検討してみました。

 BeforeUpdateRecordイベントハンドラに渡される値
(TDeltaDS.FieldValues)は、libmysql.dllによるescape処理が行われ
る前のものです。ここでescape処理を行っても、libmysql.dllよってさ
らにescape処理が行われてしまい、正しい値で更新できないように思わ
れます。

 ですので、libmysql.cに手を入れずにうまく更新させるには、高橋さ
んが[mysql 04957]でおっしゃったようにSQL文に0xで始まる16進数の並
びを書くしかないような気がします。



(例:BeforeUpdateRecordイベントでescape処理を行った場合)
元のパターン:              95 27
BeforeUpdateRecord処理後:  5C <95 5C> 27
libmysql.dllでのescape後:  5C 5C <95 5C> 5C 27
サーバ側でのunescape後:    5C <95 5C> 5C 27


 ところで、話は変わりますが。
 実は本日はDelphi 6のADOExpressでBLOB項目の値をセットする方法を
検討していました。

 libmysql.cのmysql_odbc_escape_string関数にも同様の修正を行い
mysqlclient.libをビルド、さらにMyODBCをビルドしました。しかし
escapeの問題以前にstring型に格納された画像の内容がADOExpress内部
でUnicodeに変換される際にデータが一部変化しているようで、結局SQL
文に16進数を書く方法で逃げました。

 ADO + MyODBCだとTField.LoadFromStreamの第二引数にftBlobを指定
すると実行時に「無効なタイプ」というエラーが発生してしまうので仕
方なくftStringを指定しているのですが、このことが原因だと思います。
 TField.Valueにバリアント配列(バイト型)を代入しようとしてみた
のですが、これもうまくいきませんでした(エラー内容失念)。

_________________________________________________________________
前田 剛(まえだ ごう) <maeda@xxxxxxxxxx>
株式会社ワコムアイティ プロジェクト開発部
http://www.wacom-it.co.jp/


[前][次][番号順一覧][スレッド一覧]

      4955 2002-01-18 01:50 [前田 剛 <maeda@xxxxx] sjis サーバの BLOB 項目に画像を登録 ( たぶん解決)
      4956 2002-01-18 02:25 ┣["TAKAHASHI, Tomohiro]                                       
      4957 2002-01-18 02:48 ┃┣["TAKAHASHI, Tomohiro]                                     
->    5002 2002-01-21 21:25 ┃┗[前田 剛 <maeda@xxxxx]                                     
      5003 2002-01-21 21:39 ┃ ┗["TAKAHASHI, Tomohiro]                                   
      5335 2002-04-10 23:30 ┗["TAKAHASHI, Tomohiro]