НРБ: 80020009 грешка при извличане на данни от SQL


Симптоми


Възниква следната грешка, когато получите достъп до набор записи в файл на Active Server Page (ASP), който съдържа "текст" или "Blob" тип данни от SQL таблица:
Microsoft OLE DB доставчик за грешка "80020009" за ODBC Drivers

Причина


Следващото условие може да доведе до възникване на грешката:
Текст/Blob полета са избрани в поръчка, предшестваща други типове полета.

Решение


Когато се занимавате с BLOB полета от Microsoft SQL Server, трябва да го направите отдясно на неблобте колони в resultset. За да сте сигурни, трябва да прочетете колоните и в реда отляво надясно, така че ако имате две BLOB колони като последните две колони във вашия resultset, прочетете първото и след това второто. Не ги прочитайте в обратен ред. За да покажете правилния ред за избиране на поле, създайте нова ASP страница в проект на Visual InterDev и поставете следния код в празната ASP страница. Променете низа на връзката, за да се свържете с вашия SQL Server:Забележка трябва да промените потребителското име =<потребителско име> и PWD =<силна парола, за> правилните стойности, преди да изпълните този код. Уверете се, че потребителският ИД има подходящите разрешения за извършване на тази операция в базата данни.
   <%@ 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. можете да изтеглите последните версии на компоненти за достъп до данни на Microsoft от следния уеб сайт на Microsoft:

Повече информация


SQL Server връща данните върху телта и клиентът по същество получава поток от бита, прочитани последователно в мрежовата жица. При обвързани колони (т. е. Стойностите могат да бъдат копирани в локални буфери за памет и да се кешират там), драйверът прехвърля данни в тези колони в буфери за памет. След като данните са в локални буфери, може да прочетете данните в произволен ред. Следователно можете да прочетете колоните с резултати във всеки ред, когато всички колони са обвързани (не петна). Когато включвате BLOB колони, дължината на колоната може да бъде около 2 гигабайта, а библиотеките за достъп до данни обикновено не обвързват тези колони, тъй като драйверът често не може да определи точно колко голям е този BLOB, докато не бъде извлечен. Също така библиотеките за достъп до данни обикновено не кешират BLOB данни, тъй като това може да изразходва голям обем памет и да го кешира както в библиотеката за достъп до данни, така и приложението ви е неефективно. Ако се изисква драйверът за достъп до данни да върне съдържанието на BLOB колона, той обикновено изхвърля необвързани колони, които предшестват желаната колона за BLOB, тъй като трябва да извлече последователния поток от данни, преди да може да прочете заявената колона. Следователно е по-ефективно да прочетете вашите resultset от ляво надясно, тъй като това съвпада с начина, по който се извличат данните. Имайте предвид, че това описва поведението на SQL Server. Можете да направите едно и също нещо и СУБД за клиент/сървър, но не е задължително. Може би една по-добра алтернатива е да избегнете използването на колона с текст. Тъй като SQL Server заделя място в парчета от 2K, използването на колони с текст може да доведе до неефективно използване на мястото за съхранение, ако дължината на текста е много малка. Времето за архивиране също се влияе, защото отнема повече време, за да изхвърлите регистрационния файл на транзакцията. Често е по-добре да създадете друга таблица, която има PK на вашата съществуваща таблица, колона с номер на парче и колона на VARCHAR (255). Разделяне на текста на толкова необходими фрагменти от знаци на 255 и вмъкване на толкова редове в новата таблица, тъй като има парчета. Обикновено си струва допълнителното време за кодиране, тъй като по-ефективно използване на място за съхранение и архивиране се извършва много по-бързо.