OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();
GetSchemaTable()
はどのように機能しますか?GetSchemaTable()はどのように機能しますか?
RDBMSの情報はどこにありますか?
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();
GetSchemaTable()
はどのように機能しますか?GetSchemaTable()はどのように機能しますか?
RDBMSの情報はどこにありますか?
IDataReader.GetSchemaTable()
の実装はプロバイダーによって異なるため、実装は異なります。あなたはあなた自身のプロバイダを書くことができ、あなたが望む方法でそれを行うことができます。
これはフレームワークのデザインが悪いことです。型なしのDataTable
またはDataSet
を返すインターフェイスメソッドを使用しないでください。ちょっと最初の場所でのインタフェースによって、それを制約のポイントを敗北:は、「あなたはDataTable
を返すメソッドを持っている必要がありますが、我々はそれを持っているものの行や列を気にしない」プロバイダがSQL GetSchemaTable()
ある
場合でも、 [syscolumns]
または[sysobjects]
には戻りません。結果セットはDB内のオブジェクトを反映する必要がないので、それは追加のDB呼び出しであり、追加の特権を必要とし、とにかく動作しません。
私は確かではありませんが、IDataReader.GetSchemaTable()
の実装の大部分は、結果セットで保持されているメタデータのいくつかのプロパティを読み取ることを期待しています。
各データベースのシステムテーブル(例:syscolumns、sysobjectsなど)から取得します。
GetSchemaTable()は、ADO.NETによって返された結果セットのメタデータを読み取ります。
これはいつもそうですか、それとも使用されているOLE DBプロバイダに依存していますか? –
それは間違っています。結果は動的かもしれません。ユーザはsysobjects(MSSQL 2005+のVIEW DEFINITIONを表示する権限)を持たないかもしれません。 – VladV
あなたの読者が 'SELECT 'test'、1'にあったとしますか?あなたは 'IDataReader'の結果セットで' GetSchemaTable() 'を呼び出すことができ、' [sysobjects] 'をチェックしていないでしょう。 – Keith