BUG: SqlDataReader의 GetSchemaTable()이 잘못된 열 이름을 반환한다

이 문서는 이전에 다음 ID로 출판되었음: KR307512
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
현상
SqlDataReader 개체의 GetSchemaTable 메서드가 열, BaseServerName 및 BaseCatalogName 속성을 반환합니다. 하지만 SqlDataReader.GetSchemaTable은 BaseCatalogName만 반환해야 합니다.
원인
SqlDataReader.GetSchemaTable은 Microsoft .NET Framework Class Library Software Development Kit(SDK) 설명서에 나와 있는 열 외에 BaseServerName 열도 반환합니다. BaseServerNameSqlDataReader가 사용하는 Microsoft SQL Server 인스턴스의 이름입니다. BaseServerNameDataTable에서 열 메타데이터를 설명하는 BaseCatalogName 앞에 나타납니다.
해결 방법
OleDbDataReader 개체에는 이 문제가 발생하지 않으므로 OleDbDataReader를 사용하여 SchemaTable 정보를 얻을 수 있습니다.
현재 상태
Microsoft는 본 문서의 시작 부분에 나열한 제품에서 이 문제를 확인했습니다.
추가 정보

문제를 재현하는 방법

Visual Basic .NET을 사용하는 경우

  1. Microsoft Visual Studio .NET을 열고 새로운 Visual Basic 콘솔 응용 프로그램 프로젝트를 만듭니다.
  2. Module1 모듈 앞에 다음 코드를 추가합니다.
    Imports System.Data.SqlClient
  3. Sub Main() 프로시저에 다음 코드를 추가합니다.
    Dim cnNwind As New SqlConnection("Data Source=ServerName;user id=username;" & _                                 "Password=password;Initial Catalog=Northwind;")        Dim cmd As New SqlCommand("Select * from Customers", cnNwind)        cnNwind.open()        Dim dr As SqlDataReader        dr = cmd.ExecuteReader        Dim i As Integer        For i = 0 To dr.GetSchemaTable.Columns.Count - 1        System.Console.WriteLine(dr.GetSchemaTable.Columns(i).ColumnName)        Next        System.Console.Read()                dr.Close()        cnNwind.Close()
  4. 해당 Microsoft SQL Server에 맞게 연결 문자열을 수정합니다.
  5. F5 키를 눌러 프로젝트를 컴파일하고 실행합니다. SchemaTable의 모든 열이 콘솔 창에 나타납니다. 또한 BaseServerNameBaseCatalogName 앞에 나타납니다.

Visual C# .NET을 사용하는 경우

  1. Visual Studio .NET을 열고 새로운 Visual C# 콘솔 응용 프로그램 프로젝트를 만듭니다.
  2. Class1의 ConsoleApplication1 네임스페이스 앞에 다음 코드를 추가합니다.
    using System.Data;using System.Data.SqlClient;
  3. static void Main(string[] args) 프로시저 앞에 다음 코드를 추가합니다.
    SqlConnection cnNwind = new SqlConnection("Data Source=servername;user id=username;                                          Password=password;Initial Catalog=Northwind;");        SqlCommand cmd = new SqlCommand("Select * from Customers", cnNwind);	        cnNwind.Open();        SqlDataReader dr ;			dr = cmd.ExecuteReader();			DataTable dt = dr.GetSchemaTable();				for (int i=0;i<dt.Columns.Count;i++)				{					System.Console.WriteLine(dt.Columns[i]);				}				System.Console.Read();                                dr.Close();                                cnNwind.Close();			
  4. 해당 SQL 서버에 맞게 연결 문자열을 수정합니다.
  5. F5 키를 눌러 프로젝트를 컴파일하고 실행합니다. SchemaTable의 모든 열이 콘솔 창에 나타납니다. 또한 BaseServerNameBaseCatalogName 앞에 나타납니다.

Visual C++ .NET을 사용하는 경우

  1. Visual Studio .NET을 열고 Visual C++ 관리되는 응용 프로그램 프로젝트를 만듭니다.
  2. 다음 코드를 int _tmain(void) 프로시저 앞에 추가합니다.
    #using <System.dll>#using <System.Data.dll>using namespace System;using namespace System::Data;using namespace System::Data::SqlClient ;
  3. int -tmain(void) 프로시저에 다음 코드를 추가합니다.
    SqlConnection *cnNwind = new SqlConnection("Data Source=servername;user id=username;                                           Password=password;Initial Catalog=Northwind;");    SqlCommand *cmd = new SqlCommand("Select * from Customers", cnNwind);		 cnNwind->Open();        SqlDataReader *dr ;					dr = cmd->ExecuteReader();			DataTable *dt = dr->GetSchemaTable();			int i;			for (i=0;i<dt->Columns->Count;i++)				{                                 Console::WriteLine(dt->Columns->Item [i]);				}				System::Console::Read();				dr->Close();				cnNwind->Close();			                                return 0;
  4. 해당 SQL 서버에 맞게 연결 문자열을 수정합니다.
  5. F5 키를 눌러 프로젝트를 컴파일하고 실행합니다. SchemaTable의 모든 열이 콘솔 창에 나타납니다. 또한 BaseServerNameBaseCatalogName 앞에 나타납니다.
kbreadme
속성

문서 ID: 307512 - 마지막 검토: 02/24/2014 03:30:36 - 수정: 1.2

  • Microsoft ADO .NET(.NET Framework에 포함)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.1
  • kbnosurvey kbarchive kbbug kbpending kbreadme KB307512
피드백