Как получить имя таблицы столбца из SqlDataReader

У меня есть SQL-запрос, я получаю из файла конфигурации, этот запрос обычно содержит 3-6 соединений.

Мне нужно найти во время выполнения, основываясь на результирующем наборе, представленном SqlDataReader, чтобы найти имя таблицы для каждого столбца.

вот некоторые вещи, которые не работают:

  • SqlDataReader.GetName возвращает имя столбца, но не имя таблицы.
  • SqlDataReader.Возвращает getschematable в таблице данные столбца а все имена таблиц имеют значение null.
  • запрос information_schema не помогает, потому что мне нужны данные о результатах текущего запроса (и имена столбцов не уникальны - в разных таблицах есть столбцы с одинаковым именем).

Я использую .net 3.5SP1/ C# / SQL Server 2008 в консольном приложении.

EDIT: Я знаю, что это невозможно для всех случаев, так как "колонка" могут быть объединены из нескольких таблиц, функции или даже константное выражение - Я ищу то, что работает в простом случае.

EDIT 2: выяснил, почему это не сработало - вы можете использовать SqlDataReader.GetSchemaTable для получения информации таблицы, но вы должны установить CommandBehavior в KeyInfo, вы делаете это в вызове ExecuteReader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

6 ответов


вы можете использовать SqlDataReader.GetSchemaTable для получения информации таблицы, но вы должны установить CommandBehavior в KeyInfo, вы делаете это в вызове ExecuteReader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

Я не знаю, доступна ли эта информация. В частности, не все столбцы результирующего набора поступают из таблицы. С реляционной точки зрения таблицы и результирующие наборы-это одно и то же.


этой вопрос в stackoverflow используется SqlDataReader.GetSchemaTable, чтобы получить имя таблицы. Их проблема заключается в том, что он возвращает фактическое имя таблицы, а не псевдоним, который имеет таблица. Не уверен, что это работает с вашим sql, но решил, что я дам вам знать на всякий случай.


В общем, это невозможно. Рассмотрим следующий запрос:

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

очевидно, что col1 происходит из более чем одной таблицы.


вы можете решить следующим образом :

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]));
    }
}

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());
}