ASP/VBでADOのレコードセット編集メソッドを利用する場合の注意点



このような場合に参考にして下さい

  ASPやVBでADOのレコードセット編集メソッド(Edit,Update,Insert,Delete他)を利用する場合、

  次のようなエラーが出て、ADOの動作が不安定になります。

  ・「更新する行がみつからなかったため、クエリーベースの更新に失敗しました」

  ・「複数ステップの OLE DB の操作でエラーが発生しました。
   各 OLE DB の状態の値を確認してください。作業は終了しませんでした」

  これはDSNのオプションを設定することで回避できます。以下の説明をご参照下さい。


対処方法

  DSN(ODBCデータソース)で次のオプションをONにすることによって正常に処理されるようになります。

オプションオプション値備考
Don't optimize column width1 
Return matching rows2 
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型のデータや集計結果数値の取得時に

    予期せぬエラーが発生します。