10

構成ファイルから取得したSQLクエリがあります。このクエリには通常、3〜6個の結合が含まれています。

実行時に、SqlDataReaderで表される結果セットに基づいて、各列のテーブルの名前を見つける必要があります。

動作しないものがいくつかあります:

  • SqlDataReader.GetNameは列名を返しますが、テーブル名は返しません。
  • SqlDataReader.GetSchemaTableは、列情報を含むデータテーブルを返しますが、すべてのテーブル名はnullです。
  • 現在のクエリの結果に関するデータが必要なため、information_schemaのクエリは役に立ちません(列名は一意ではありません。異なるテーブルに同じ名前の列があります)。

コンソールアプリケーションで.net3.5SP1/ C#/ SQLServer2008を使用しています。

編集:「列」は複数のテーブル、関数、さらには定数式から組み合わせることができるため、これがすべての場合に可能であるとは限りません。単純な場合に機能するものを探しています。

編集2:それが機能しなかった理由を見つけました-SqlDataReader.GetSchemaTableを使用してテーブル情報を取得できますが、CommandBehaviorをKeyInfoに設定する必要があります。これは、ExecuteReader呼び出しで行います。

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
4

7 に答える 7

12

SqlDataReader.GetSchemaTable を使用してテーブル情報を取得できますが、CommandBehavior を KeyInfo に設定する必要があります。これは ExecuteReader 呼び出しで行います。

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
于 2010-06-24T13:25:47.327 に答える
3

stackoverflow に関するこの未回答の質問は、SqlDataReader.GetSchemaTable を使用してテーブル名を取得します。彼らの問題は、テーブルが持つエイリアスではなく、実際のテーブル名を返すことです。これがあなたのSQLで機能するかどうかはわかりませんが、念のためお知らせします。

于 2010-06-23T15:32:32.207 に答える
2

この情報が利用できるかどうかはわかりません。特に、結果セットのすべての列がテーブルからのものであるとは限りません。リレーショナルの観点からは、テーブルと結果セットは同じものです。

于 2010-06-23T15:10:30.883 に答える
1

次のように解決できます。

DataTable schemaTable = sqlReader.GetSchemaTable();

foreach (DataRow row in schemaTable.Rows)
{
    foreach (DataColumn column in schemaTable.Columns)
    {
        MessageBox.Show (string.Format("{0} = {1}", column.ColumnName, row[column]));
    }
}
于 2013-05-14T08:51:06.630 に答える
1

一般に、これは不可能です。次のクエリを検討してください。

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

明らかに、col1 は複数のテーブルから取得されます。

于 2010-06-24T15:04:31.793 に答える
0
SqlCeConnection conn = new SqlCeConnection("Data Source = Database1.sdf");
SqlCeCommand query = conn.CreateCommand();
query.CommandText = "myTableName";
query.CommandType = CommandType.TableDirect;
conn.Open();
SqlCeDataReader myreader = query.ExecuteReader(CommandBehavior.KeyInfo);
DataTable myDataTable= myreader.GetSchemaTable();
//thats the code you asked. in the loop
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
    listView1.Columns.Add(myDataTable.Rows[i][0].ToString());
}
于 2016-06-05T16:56:16.983 に答える