PRB: 80020009 błąd podczas pobierania danych z programu SQL


Symptomy


Podczas uzyskiwania dostępu do zestawu rekordów w pliku programu Active Server Pages (ASP), który zawiera tekst "tekstowy" lub "BLOB", jest wyświetlany następujący błąd:
Dostawca Microsoft OLE DB dla sterowników ODBC błąd "80020009"

Przyczyna


Poniższy warunek może powodować wystąpienie błędu:
Pola tekstowe i BLOB są zaznaczone w kolejności poprzedzającej inne typy pól.

Rozwiązanie


Jeśli chodzi o pola BLOB z programu Microsoft SQL Server, należy je umieścić na prawo od kolumn niebędących kolumnami BLOB w zestawie wyników. Aby być bezpieczna, należy również przeczytać kolumny w kolejności od lewej do prawej, więc jeśli masz dwie kolumny obiektu BLOB jako ostatnie dwie kolumny w zestawie wyników, przeczytaj pierwszą z nich, a następnie drugi. Nie należy czytać ich w odwrotnej kolejności. Aby pokazać prawidłową kolejność zaznaczania pól, Utwórz nową stronę ASP w projekcie programu Visual InterDev i wklej poniższy kod na pustej stronie ASP. Modyfikowanie parametrów połączenia w celu nawiązania połączenia z programem SQL Server:Uwaga należy zmienić nazwę użytkownika =<username> i PWD =<silnego hasła> na właściwe wartości przed uruchomieniem tego kodu. Upewnij się, że identyfikator użytkownika ma odpowiednie uprawnienia do wykonania tej operacji na bazie danych.
   <%@ 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>

Stan


Takie działanie jest celowe. Jednak w przypadku korzystania z programu SQL Server w wersji z dodatkiem SP2 lub nowszym za pomocą sterownika usługi 3,7 lub nowszego nie występują te dane. Najnowsza wersja składników Microsoft Data Access Components można pobrać z następującej witryny firmy Microsoft w sieci Web:

Więcej informacji


Program SQL Server wysyła z powrotem dane z drutu, a klient odbiera strumieniowo wiadomości w postaci bitów w sieci. W przypadku kolumn związanych (czyli wartości, które można skopiować do lokalnych buforów pamięci i buforowanych w tej lokalizacji), sterownik przesyła dane w tych kolumnach do buforów pamięci. Gdy dane są w buforach lokalnych, dane można odczytać w dowolnej kolejności. Można więc odczytać kolumny wyników w dowolnej kolejności, gdy wszystkie kolumny są powiązane (nie obiekty blob). Po dołączeniu kolumn obiektu BLOB długość kolumny może wynosić około 2 gigabajtów, a biblioteki dostępu do danych zazwyczaj nie są powiązane z tym, że kierowca często nie może dokładnie określić, jak duży rozmiar obiektu BLOB jest do momentu pobrania. Ponadto biblioteki dostępu do danych zazwyczaj unikają buforowania danych BLOB, ponieważ może to zużywać dużo pamięci i buforować je zarówno w bibliotece dostępu do danych, jak i że aplikacja jest niewydajna. Jeśli sterownik dostępu do danych jest wymagany do zwrócenia zawartości kolumny obiektu BLOB, zwykle odrzuca on kolumny niepowiązane, które poprzedzają żądaną kolumnę obiektu BLOB, ponieważ musi pobrać strumień danych sekwencyjnych, zanim będzie mógł odczytać żądaną kolumnę. Z tego powodu bardziej wydajna metoda polega na odczytaniu zestawu wyników od lewej do prawej, ponieważ jest to zgodne z sposobem pobierania danych. Należy zauważyć, że w tym artykule opisano zachowanie programu SQL Server. Baza danych Oracle i inne system DBMS klientów/serwerów mogą wykonywać te same czynności, ale nie jest to wymagane. Być może lepszym rozwiązaniem jest unikanie używania kolumny tekstowej. Program SQL Server przydziela miejsce w fragmentach 2K, przy użyciu kolumn tekstowych może powodować niewydajne korzystanie z pamięci, jeśli długość tekstu jest bardzo mała. Na czas kopii zapasowej jest również uwzględniana wielkość czasu zrzucania dziennika transakcji. Często lepszym rozwiązaniem jest utworzenie innej tabeli zawierającej klucz podstawowy istniejącej tabeli, kolumny numeru fragmentu i kolumny varchar (255). Podziel tekst na tyle potrzebny fragmentów znaków: 255, a następnie Wstaw tyle wierszy w nowej tabeli, ile jest fragmentów. Zazwyczaj warto skorzystać z dodatkowego czasu kodowania, ponieważ zwiększanie wydajnego użytkowania miejsca do magazynowania i wykonywania kopii zapasowych przebiega znacznie szybciej.