- PR -

SqlDataReader.GetSchemaTable の IsKey が正常に取得できない

1
投稿者投稿内容
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 2004-04-01 16:12
C# で WindowsForm + SQL Server 2000 で開発している ごてん と申します。

SQLを自動生成するメソッドを作る目的で、対象となるテーブルの属性を取得しようと
sqlDataReader の GetSchemaTable メソッドで各列のメタデータを取得しています。

以下のURLを参考にしました。
http://support.microsoft.com/default.aspx?scid=kb;ja;310107

ところが、OleDbDataReader を使用した場合は、
キーであるフィールドなら true、そうでないフィールドなら false と
IsKey の値が正常に取得できるのですが
SqlDbDataReader では 上記URLのサンプルどおりのコードでも
必ず IsKey の 値が DBNull になってしまうのです。

同様の現象で解決された方はいらっしゃらないでしょうか?

こちらの環境は
VS.NET 2003 & SQL Server 2000 SP3 です。

よろしくお願いいたします。
KEI
会議室デビュー日: 2003/12/25
投稿数: 4
投稿日時: 2004-04-01 16:33
KEIです
引用:

GO-TENさんの書き込み (2004-04-01 16:12) より:

以下のURLを参考にしました。
http://support.microsoft.com/default.aspx?scid=kb;ja;310107


そうですね。上記の方法ではとれないようです。そこでExecuteReaderの引数を少し変えてみました。私の環境ではこれで取得できました。
コード:
//Employees テーブルのレコードを DataReader に取得します。
cmd.Connection = cn;
cmd.CommandText = "SELECT * FROM Employees";
myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);


環境:.Netframework1.1,SQLServer2000-SP3
GO-TEN
常連さん
会議室デビュー日: 2003/12/07
投稿数: 20
投稿日時: 2004-04-02 08:55
ごてんです。
KEIさんのご指摘のとおり、behavior パラメータを KeyInfo に設定して
ExecuteReader を呼び出すと、正常に取得できました。
ありがとうございました。

参考にしたURLには記述がなかったのですが、
HELPの方で以下のメモがありました(申し訳ないです。気が付きませんでした)。

「メモ メタデータの列が正しい情報を確実に返すようにするには、
 behavior パラメータを KeyInfo に設定して
 ExecuteReader を呼び出す必要があります
 それ以外の場合、スキーマ テーブルのいくつかの列は、
 既定のデータ、null、または正しくないデータを返します。」

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1041/cpref/html/
frlrfsystemdatasqlclientsqldatareaderclassgetschematabletopic.htm
1

スキルアップ/キャリアアップ(JOB@IT)