ODBC ドライバー用 Microsoft OLE DB プロバイダー エラー '80040e21' 複数ステップの OLE DB 操作でエラーが発生しました。可能であれば、各 OLE DB ステータス値を確認してください。仕事は何も行われません。ウェブサイトのプログラム、ニュースを追加するときにエラーが発生しました
エラーメッセージは次のとおりです。
Microsoft OLE DB Provider for ODBC Drivers エラー「80040e21」
複数ステップの OLE DB 操作によりエラーが生成されます。可能であれば、各 OLE DB ステータス値を確認してください。仕事は何も行われません。
このエラーの原因は、元の接続文字列が Provier=Microsoft.Jet.OLEDB .4.0; であったのに対し、アクセス接続文字列を Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath) に変更したことです。データ ソース = & Server.Mappath(DbPath) の場合、このエラーは発生しません。 Access データベースに接続するこれら 2 つの方法にはいくつかの違いがあるようです。少なくとも後者の接続方法の方が耐障害性の点では優れていますが、仕様の点では明らかに形式的ではありません。
わかりやすくするために、以下ではこれら 2 つのメソッドをプロバイダー接続とドライバー接続と呼びます。
ニュースを修正した場合、上記のエラーは表示されません。コードを見てみると、追加する際にExcuteで取得したレコードセットがクローズされていませんでした。オフにしてしまい、正常に動作しなくなりました。
そこでコードを書いて簡単なテーブルを設計したところ、この時点で 2 つの接続メソッドを追加できることがわかったので、このコード内のテーブルを元のテーブルに戻しましたが、やはり実行できませんでした。時計と関係あるのでしょうか?
そこでフォームを注意深く調べ始めたところ、元のフォームにはプログラムで値が割り当てられる自動番号フィールドがあることがわかりました。自動番号には値を割り当てることができないと記憶しています。そこでそのテーブルの自動採番を外したところ、正常に実行できるようになりました。
プロバイダーモードで接続することで自動採番フィールドに値を代入できるようです。
違いについてはまた別のところでお話しましょう。
ドライバーを使用して接続すると、チャネル設定中に Null 値が表示されましたが、実際にはデータベースに値があり、このフィールドのデータ型を確認したところ、コメントでした。ドライバーのロングノートへの対応があまり良くないということでしょうか?いいえ、私のニュース テーブルのニュース コンテンツはメモでなければなりません。これが理由ではありません。
理由は何ですか?彼が別の音符の後ろにいるからでしょうか?ただし、ニュース表にも 2 つのメモがあり、内容メモも紹介メモの後ろにあります。この疑惑も解消されました。
このフィールドにキーワードがあるからでしょうか?このフィールドの値を 1 に変更しましたが、結果も間違っていました。
理由は何ですか?
自分で別のページのテストを作成するだけです。テストコードは次のとおりです。
以下はテストコードです。
次のようにコードをコピーします。
薄暗い
set conn=server.createobject(adodb.recordset)
conn.open driver={Microsoft アクセス ドライバー (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'ドライバーの接続方法
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'プロバイダ接続方法
set rs=conn.execute(s_channel から * を選択 (channelID=11))
応答.書き込み rs(アップロード設定)
rs.close
setrs=なし
両方の接続が正常に出力できることが判明した場合。
そこで、レコードセットを開いたばかりの元のコードで出力(response.write)したところ、その場所でフィールドの値が正常に出力できることが分かりました。そこで、出力コードを下に移動し続け、最終的には次のように移動しました。
コードスニペットは次のとおりです。
次のようにコードをコピーします。
if IsNull(rs(UploadSetting)) または rs(UploadSetting)= then
UploadSetting=Split(1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg| asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1,@)
それ以外
UploadSetting=Split(rs(UploadSetting),@)
終了する場合
if より上に置くと正常に内容が出力されるのですが、else より後に置くと Null が出力されるのはなぜでしょうか。
最終的なテストコードは次のようになります
以下はテストコードです。
次のようにコードをコピーします。
薄暗い
set conn=server.createobject(adodb.recordset)
conn.open driver={Microsoft アクセス ドライバー (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'ドライバーの接続方法
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'プロバイダ接続方法
set rs=conn.execute(channelID=11 の s_channel から * を選択)
応答.書き込み rs(アップロード設定)
if IsNull(Rs(UploadSetting)) または rs(UploadSetting)= then
応答。DD を書き込みます
それ以外
応答.書き込み rs(アップロード設定)
終了する場合
rs.close
setrs=なし
上記のコードは、プロバイダー モードで接続した場合は rs(uploadSetting) の値を正しく出力できますが、ドライバー モードでは何も出力しません。
Driverモードではリマーク内容は一度しか参照できず、再度参照するとNULL値になるということが理解できますか。プロバイダーではこのようなことは起こりません。
この状況に適応するには、変数を渡すことしかできません。メモ フィールドの内容を直接引用するのではなく、最初に変数に与えます。