Entrar

CORRECÇÃO: SQLColAttribute retorna atributos de tabela incorreta ao nome da tabela contém um período

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

290646
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Erro nº: 46409 (SHILOH_bug)
BUG #: 56030 (SQLBUG_70)
Sintomas
Quando você usa a função SQLColAttribute para retornar informações descritor SQL_DESC_SCHEMA_NAME, SQL_DESC_TABLE_NAME, SQL_DESC_BASE_TABLE_NAME ou SQL_DESC_CATALOG_NAME, valores incorretos podem ser retornados quando o nome da tabela contém um período.
Causa
ODBC usa períodos para delimitar objetos SQL Server no formato Computer.Database.Owner.Object.
Resolução

SQL Server 2000

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211INF: Como obter o Service Pack mais recente do SQL Server 2000

SQL Server 7.0

Para contornar esse problema, não use períodos dentro os nomes de objetos do SQL Server.

Microsoft Data Access Components (MDAC)

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft Data Access Components 2.6. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
300635INFO: Como obter o último MDAC 2.6 Service Pack
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo.

SQL Server 2000

Esse problema foi corrigido primeiro no SQL Server 2000 Service Pack 1.

Microsoft Data Access Components (MDAC)

Esse problema foi corrigido primeiro no Microsoft Data Access Components 2.6 Service Pack 1.
Mais Informações

Etapas para reproduzir o problema

  1. Cole o seguinte código em um novo arquivo .cpp:
    #include <windows.h>#include <stdio.h>#include <tchar.h>#include "sql.h"#include "sqlext.h"#include "odbcss.h"int main()    {    // ODBC handles    SQLHENV     henv = NULL;    SQLHDBC     hdbc = NULL;    SQLHSTMT    hstmt = NULL;	char szData[100];	short l; 	//These must be modified for your specific DSN    PTSTR       szDataSource = _T("localserver");    PTSTR       szUID = _T("UserName");    PTSTR       szPWD = _T("Password");	PTSTR		szDropTable = _T("if exists (select * from dbo.sysobjects where id = object_id(N'[my.table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [my.table]");	PTSTR		szCreateTable = _T("Create Table [my.table] (col1 int)");	PTSTR       szSQLSelect = _T("Select * from dbo.[my.table]");    // Initialize the ODBC environment.    if (SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv) == SQL_ERROR)        goto EXIT;    SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER);    // Allocate a connection handle and connect to the data source.    if (SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc) == SQL_ERROR)        goto EXIT;    if (SQLConnect(hdbc, (SQLTCHAR*) szDataSource, SQL_NTS, (SQLTCHAR*) szUID, SQL_NTS, (SQLTCHAR*) szPWD, SQL_NTS) == SQL_ERROR)        goto EXIT;    // Get a statement handle and execute a Transact-SQL SELECT statement.    if (SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt) == SQL_ERROR)        goto EXIT;	if(SQLSetScrollOptions( hstmt, SQL_CONCUR_VALUES, SQL_SCROLL_DYNAMIC, 1) == SQL_ERROR)		goto EXIT;	if (SQLExecDirect(hstmt, (SQLTCHAR*) szDropTable, SQL_NTS) == SQL_ERROR)        goto EXIT;	if (SQLExecDirect(hstmt, (SQLTCHAR*) szCreateTable, SQL_NTS) == SQL_ERROR)        goto EXIT;	if (SQLExecDirect(hstmt, (SQLTCHAR*) szSQLSelect, SQL_NTS) == SQL_ERROR)        goto EXIT;	if (SQLColAttribute(hstmt, 1, SQL_DESC_SCHEMA_NAME , &szData, 100, &l, NULL) ==SQL_ERROR)		goto EXIT;	_tprintf(_T("SQL_DESC_SCHEMA_NAME = %s, should be dbo\n"),szData);	if (SQLColAttribute(hstmt, 1, SQL_DESC_TABLE_NAME , &szData, 100, &l, NULL) ==SQL_ERROR)		goto EXIT;	_tprintf(_T("SQL_DESC_TABLE_NAME = %s, should be my.table\n"),szData);	if (SQLColAttribute(hstmt, 1, SQL_DESC_BASE_TABLE_NAME , &szData, 100, &l, NULL) ==SQL_ERROR)		goto EXIT;	_tprintf(_T("SQL_DESC_BASE_TABLE_NAME = %s, should be my.table\n"),szData);	if (SQLColAttribute(hstmt, 1, SQL_DESC_CATALOG_NAME, &szData, 100, &l, NULL) ==SQL_ERROR)		goto EXIT;	_tprintf(_T("SQL_DESC_CATALOG_NAME = %s, should be database specified in dsn\n"),szData);EXIT:    if (hstmt != NULL)        {        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);        }    if (hdbc != NULL)        {        SQLDisconnect(hdbc);        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);        }    if (henv != NULL)        {        SQLFreeHandle(SQL_HANDLE_ENV, henv);        }    return (0);    }					
  2. Compile o código e executá-lo. Os resultados são da seguinte maneira:
    SQL_DESC_SCHEMA_NAME = my, should be dboSQL_DESC_TABLE_NAME = table, should be my.tableSQL_DESC_BASE_TABLE_NAME = table, should be my.tableSQL_DESC_CATALOG_NAME = dbo, should be database specified in dsn					

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 290646 - Última Revisão: 01/16/2015 21:48:41 - Revisão: 3.2

  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • kbnosurvey kbarchive kbmt kbbug kbfix kbmdac260sp1fix kbsqlserv2000sp1fix KB290646 KbMtpt
Comentários