ASP/VBでADOのレコードセット編集メソッドを利用する場合の注意点
▲
■
このような場合に参考にして下さい
ASPやVBでADOのレコードセット編集メソッド(Edit,Update,Insert,Delete他)を利用する場合、
次のようなエラーが出て、ADOの動作が不安定になります。
・「更新する行がみつからなかったため、クエリーベースの更新に失敗しました」
・「複数ステップの OLE DB の操作でエラーが発生しました。
各 OLE DB の状態の値を確認してください。作業は終了しませんでした」
これはDSNのオプションを設定することで回避できます。以下の説明をご参照下さい。
■
対処方法
DSN(ODBCデータソース)で次のオプションをONにすることによって正常に処理されるようになります。
オプション
オプション値
備考
Don't optimize column width
1
Return matching rows
2
Change LONGLONG columns to INT columns
(some applications can't handle LONGLONG)
16384
※ MDACが2.6SP1より古い場合のみ
コード上で行うなら
DB.Open "DSN=mysql-test;OPTION=16387;"
または
DB.Open "DRIVER={MySQL};SERVER=192.168.10.101;
USER=mysql;PASSWORD=pwd;DATABASE=tsumiki;OPTION=16387;"
のようにOPTIONパラメータにオプション値(16387=1+2+16384)を設定します。
■
説明
ぞれぞれのオプションの意味は以下の通りです。
▽
「Don't optimize column width」
取得したカラムのサイズを最適化しないようにします。
このオプションを設定しない場合(デフォルト)、カラムのサイズは実際に取得したデータのサイズに
最適化されます。結果、余分なバッファが削除され、リソースの消費が抑えられます。
反面、レコードセットの編集機能(Edit,Updateメソッドなど)を利用する場合は、余分なバッファが
削除されているために、現在のサイズを上回る値を設定することができません。
以上の理由で、レコードセットの編集機能を利用する場合はこのオプションをONにする必要があります。
▽
「Return matching rows」
クエリーの処理結果行数を取得する際に、「影響を受けた行数」ではなく、「クエリーに一致した行数」を
返すようにします。
MySQLでは、実際に更新処理が発生した行のみを、処理結果の行数としてカウントします。
例えば、現在の値が'0001'のフィールドに対して、'0001'に更新するUPDATE文を実行した場合
実際には更新処理が発生しないため、処理結果の行数は0になります。
ところが、多くのMicrosoft社製品(ASP,VB,Access他)では、たとえ実際に更新が発生していなくても
処理対象の行が存在する場合は、それをカウントすることが前提となっています。
特にレコードセットの編集機能では、(メソッド内部で実行される)更新クエリーの処理結果行数によって
編集の成否を判定することがあるため、このオプションをONにする必要があります。
このオプションを指定しなかった場合は
「更新する行がみつからなかったため、クエリーベースの更新に失敗しました」のようなエラーが発生します。
▽
「Change LONGLONG columns to INT columns(some applications can't handle LONGLONG)」
LONGLONG型の数値をINT型に変換します。
これはODBC Driver ManagerがLONGLONG型(16bit)整数を正常に扱う事が出来ない不具合を
回避するためのオプションです。
MDAC(2.6SP1以降)では修正されているので
http://www.microsoft.com/japan/msdn/data/default.asp
から最新版をインストールすることをお勧めします。
MDACを更新することが出来ない場合は、このオプションをONにして下さい。
この問題が解消されていない場合BIGINT型のデータや集計結果数値の取得時に
予期せぬエラーが発生します。