80020009データを取得するときにエラーが発生SQL

この記事では、データを取得するときに80020009エラーを解決するのに役立SQL Server。

元の製品バージョン:  SQL Server
元の KB 番号:   175239

現象

次のエラーは、テーブルからデータを含む、またはデータを入力Active Server Pages (ASP) ファイル内のレコードセットにアクセスするときに Text Blob SQLされます。

MICROSOFT OLE DB Provider for ODBC Drivers エラー '80020009'

原因

次の条件により、エラーが発生する可能性があります。

テキスト/BLOB フィールドは、他の種類のフィールドより前の順序で選択されます。

解決方法

データ セットから BLOB フィールドMicrosoft SQL Server、結果セットの BLOB 以外の列の右側に置く必要があります。 安全を確保するには、左から右の順序で列を読み取る必要があります。したがって、結果セットの最後の 2 つの列として 2 つの BLOB 列がある場合は、最初の列と 2 番目の列を読み取る必要があります。 逆の順序で読み取る必要はありません。

フィールド選択の正しい順序を示す場合は、Visual InterDev Projectに新しい ASP ページを作成し、次のコードを空の ASP ページに貼り付けます。 接続文字列を変更して、次のSQL Server。

注意

このコードを実行する前 <username> に、Username= と PWD= を正 <strong password> しい値に変更する必要があります。 ユーザー ID に、データベースに対してこの操作を実行するための適切なアクセス許可を持っている必要があります。

 <%@ Language=VBScript %>
 <HTML>
     <BODY bgcolor=white>
         <%
             Set cn = Server.CreateObject("ADODB.Connection")
             Set rs = Server.CreateObject("ADODB.Recordset")'Open the connection.
             cn.Open "dsn=yoursystemdsn;Username=<username>;PWD=<strong password>;database=pubs;"
    
            'Open the recordset.

            'Notice that the Blob field, pr_info, is last in the field order.

            rs.Open "select pub_id, pr_info from pub_info", cn

            While Not rs.EOF

            Response.Write "<P>PR Info:<P>" & rs("pr_info")
             Response.Write "<P>That was the PR Info for PubID " & 
             rs("pub_id")
             rs.MoveNext
             Wend
         %>
     </BODY>
 </HTML>

状態

この動作は仕様です。 ただし、Mdac 2.1 sp2 以降を 3.7 以降のドライバーで使用している場合はSQL Server。

詳細情報

SQL Server上のデータを送信し、クライアントは基本的にネットワーク ワイヤー上で順次読み取るビットストリームを受信しています。 バインドされた列 (つまり、値をローカル メモリ バッファーにコピーしてキャッシュできる) を使用すると、ドライバーはそれらの列のデータをメモリ バッファーに転送します。 データがローカル バッファーに入った後は、任意の順序でデータを読み取る可能性があります。 したがって、すべての列がバインドされている (BLOB ではない) 場合は、任意の順序で結果列を読み取ります。

BLOB 列を含める場合、列の長さは約 2 ギガバイトで、データ アクセス ライブラリは通常、取得するまで BLOB の大きいサイズを正確に判断できない場合が多く、これらの列はバインドされません。 また、データ アクセス ライブラリは、通常、大量のメモリを消費し、データ アクセス ライブラリとアプリケーションの両方でキャッシュする可能性があるという理由で、BLOB データのキャッシュを回避します。 データ アクセス ドライバーが BLOB 列の内容を返す必要がある場合、要求された列を読み取る前に順次データ ストリームを取得する必要があるので、通常、要求された BLOB 列の前にバインドされていない列を破棄します。 したがって、データの取得方法と一致するため、左から右に結果セットを読み取る方が効率的です。

注意

これは、ユーザーの動作をSQL Server。 Oracle と他のクライアント/サーバー DBMS は同じことを行う場合がありますが、必須ではありません。

おそらく、テキスト列を使用しないようにする方が良い方法です。 2K SQL Server領域を割り当てるので、テキスト列を使用すると、テキストの長さが小さい場合にストレージが非効率的に使用される可能性があります。 バックアップ時間は、トランザクション ログのダンプに時間がかかるため、影響を受ける場合があります。 多くの場合、既存のテーブルの PK、チャンク番号列、および列を持つ別のテーブルを作成する方が良 varchar (255) いです。 テキストを必要な 255 文字のチャンクに分割し、チャンクがある場合と同じ数の行を新しいテーブルに挿入します。 ストレージをより効率的に使用し、バックアップをはるかに高速に行うので、通常はコーディング時間を追加する価値があります。