REVISIÓN: SQLColAttribute devuelve atributos de tabla incorrecto al nombre de la tabla contiene un punto

Seleccione idioma Seleccione idioma
Id. de artículo: 290646 - Ver los productos a los que se aplica este artículo
Error nº: 46409 (SHILOH_bug)
Nº DE ERROR: 56030 (SQLBUG_70)
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza la función SQLColAttribute para devolver información de descriptor SQL_DESC_SCHEMA_NAME, SQL_DESC_TABLE_NAME, SQL_DESC_BASE_TABLE_NAME o SQL_DESC_CATALOG_NAME, se pueden devolver valores incorrectos cuando el nombre de la tabla contiene un período.

Causa

ODBC utiliza períodos para delimitar los objetos de SQL Server en formato Computer.Database.Owner.Object.

Solución

SQL Server 2000

Para resolver este problema, consiga el Service Pack más reciente para Microsoft SQL Server 2000. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211INF: Cómo obtener el Service Pack más reciente de SQL Server 2000

SQL Server 7.0

Para evitar este problema, no utilice períodos dentro de los nombres de objetos de SQL Server.

Microsoft Data Access Components (MDAC)

Para resolver este problema, obtenga el service pack más reciente para Microsoft Data Access Components 2.6. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
300635INFO: Cómo obtener la más reciente de MDAC 2.6 Service Pack

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:" de este artículo.

SQL Server 2000

Este problema se corrigió por primera vez en SQL Server 2000 Service Pack 1.

Microsoft Data Access Components (MDAC)

Este problema se corrigió por primera vez en Microsoft Data Access Components 2.6 Service Pack 1.

Más información

Pasos para reproducir este comportamiento

  1. Pegue el código siguiente en un nuevo archivo .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. Compilar el código y ejecutarlo. Los resultados son:
    SQL_DESC_SCHEMA_NAME = my, should be dbo
    SQL_DESC_TABLE_NAME = table, should be my.table
    SQL_DESC_BASE_TABLE_NAME = table, should be my.table
    SQL_DESC_CATALOG_NAME = dbo, should be database specified in dsn
    					

Propiedades

Id. de artículo: 290646 - Última revisión: viernes, 31 de octubre de 2003 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Palabras clave: 
kbmt kbbug kbfix kbmdac260sp1fix kbsqlserv2000sp1fix KB290646 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 290646

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com