[BUG] SqlDataReader の GetSchemaTable() が誤った列名を返す

文書翻訳 文書翻訳
文書番号: 307512 - 対象製品
この記事は、以前は次の ID で公開されていました: JP307512
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
すべて展開する | すべて折りたたむ

目次

現象

SqlDataReader オブジェクトの GetSchemaTable メソッドは、列、BaseServerName プロパティ、および BaseCatalogName プロパティを返します。しかし、本来 SqlDataReader.GetSchemaTable は BaseCatalogName のみを返さなければなりません。

原因

SqlDataReader.GetSchemaTable は、Microsoft .NET Framework クラス ライブラリ SDK (Software Development Kit) のドキュメントで説明されているクラス以外に BaseServerName という名前の列も返します。BaseServerName は、SqlDataReader が使用する Microsoft SQL Server のインスタンスの名前です。BaseServerName は、列のメタデータを示す DataTable で BaseCatalogName の前に表示されます。

解決方法

この問題は OleDbDataReader オブジェクトでは発生しないため、OleDbDataReader を使用して SchemaTabale 情報を取得できます。

状況

マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。

詳細

問題の再現手順

Visual Basic .NET の場合

  1. Microsoft Visual Studio .NET を起動して、新しい Visual Basic コンソール アプリケーション プロジェクトを作成します。
  2. 次のコードを Module 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 のすべての列がコンソール ウィンドウに表示されることを確認してください。また、BaseServerName が BaseCatalogName の前に表示されるも確認してください。

Visual C# .NET の場合

  1. Visual Studio .NET を起動して、新しい Visual C# コンソール アプリケーション プロジェクトを作成します。
  2. 次のコードを Class1 の namespace ConsleApplication1 より前に追加します。
    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. 接続文字列を使用している Microsoft SQL Server に合わせて変更します。
  5. F5 キーを押して、プロジェクトをコンパイルし、実行します。SchemaTable のすべての列がコンソール ウィンドウに表示されることを確認してください。また、BaseServerName が BaseCatalogName の前に表示されることも確認してください。

Visual C++ .NET の場合

  1. Visual Studio .NET を起動して、Managed 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. 接続文字列を使用している Microsoft SQL Server に合わせて変更します。
  5. F5 キーを押して、プロジェクトをコンパイルし、実行します。SchemaTable のすべての列がコンソール ウィンドウに表示されることを確認してください。また、BaseServerName が BaseCatalogName の前に表示されることも確認してください。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 307512 (最終更新日 2002-01-18) をもとに作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 307512 - 最終更新日: 2014年2月24日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft ADO .NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
キーワード:?
kbnosurvey kbarchive kbbug kbpending KB307512
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

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