PROBLEMA: erro do 80020009 ao recuperar dados do SQL

Sintomas

O erro a seguir ocorre ao acessar um conjunto de registros em um arquivo ASP que contém os dados do tipo "texto" ou "blob" de uma tabela SQL:

Erro "80020009" do provedor Microsoft OLE DB para drivers ODBC

Causa

A seguinte condição pode fazer com que o erro ocorra:

Os campos texto/blob são selecionados em um pedido anterior a outros tipos de campos.

Resolução

Ao lidar com campos de BLOB do Microsoft SQL Server, você deve colocá-los à direita de colunas não BLOB no ResultSet. Para ser seguro, você também deve ler as colunas da esquerda para a direita, portanto, se você tiver duas colunas BLOB como as duas últimas colunas em seu ResultSet, leia a primeira e depois a segunda. Não os leia na ordem inversa. Para demonstrar a ordem correta da seleção de campo, crie uma nova página ASP em um projeto do Visual InterDev e cole o código a seguir na página ASP em branco. Modifique a cadeia de conexão para se conectar ao SQL Server:Observação você deve alterar username =<username> e PWD =<senha de alta segurança> para os valores corretos antes de executar esse código. Verifique se a identificação do usuário tem as permissões adequadas para executar esta operação no banco de dados.

   <%@ 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>

Status

Este é o comportamento padrão. No entanto, ele não ocorre quando você usa o MDAC 2.1 SP2 ou posterior com o driver do 3,7 ou posterior para SQL Server. você pode baixar a versão mais recente do Microsoft Data Access Components a partir do seguinte site da Microsoft:

Informações adicionais

O SQL Server está retornando os dados no fio e o cliente está essencialmente recebendo um fluxo de bits lido sequencialmente no cabo de rede. Com colunas associadas (ou seja, os valores podem ser copiados para buffers de memória locais e armazenados nele), o driver transfere dados nessas colunas para buffers de memória. Depois que os dados estiverem em buffers locais, você poderá ler os dados em qualquer ordem. Portanto, você pode ler colunas de resultado em qualquer ordem quando todas as colunas estiverem associadas (não BLOBs). Quando você inclui colunas de BLOB, o comprimento da coluna pode ser de aproximadamente 2 gigabytes, e as bibliotecas de acesso a dados geralmente não associam essas colunas, pois o driver geralmente não consegue determinar o tamanho exato do BLOB até a recuperação. Além disso, as bibliotecas de acesso a dados costumam evitar o cache de dados BLOB, pois isso pode consumir grandes quantidades de memória e armazenar em cache as duas na biblioteca de acesso a dados, e seu aplicativo é ineficiente. Se o driver de acesso a dados for solicitado a retornar o conteúdo de uma coluna BLOB, ele normalmente descarta colunas não associadas que precedem a coluna BLOB solicitada, pois ela deve recuperar o fluxo de dados sequencial antes de poder ler a coluna solicitada. Portanto, é mais eficiente ler o ResultSet da esquerda para a direita, pois isso corresponde à maneira como os dados são recuperados. Observe que isso descreve o comportamento do SQL Server. Os DBMSs do cliente/servidor da Oracle e outros podem fazer a mesma coisa, mas isso não é necessário. Talvez uma alternativa melhor seja evitar usar uma coluna de texto. Como o SQL Server aloca espaço em pedaços de 2K, o uso de colunas de texto pode resultar em uso ineficiente do armazenamento se o comprimento do texto for muito pequeno. O tempo de backup também é afetado porque demora mais para despejar o log de transação. Geralmente é melhor criar outra tabela que tenha a CP da sua tabela existente, uma coluna de número de partes e uma coluna varchar (255). Divida o texto em quantos pedaços de 255 caracteres forem necessários e insira quantas linhas na nova tabela quantos houver blocos. Geralmente, vale o tempo de codificação adicional, uma vez que você faz uso mais eficiente do armazenamento e dos backups se torna muito mais rápido.

Precisa de mais ajuda?

Expanda suas habilidades
Explore o treinamento
Obtenha novos recursos primeiro
Ingressar no Microsoft Insider

Estas informações foram úteis?

Obrigado por seus comentários!

Agradecemos pelos seus comentários! Parece que pode ser útil conectar você a um de nossos agentes de suporte do Office.

×