Как получить имя таблицы столбца из SqlDataReader - PullRequest
8 голосов
/ 23 июня 2010

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я знаю, что это возможно не во всех случаях, так как «столбец» может быть объединен из нескольких таблиц, функции или даже константного выражения - я ищу что-то, что работает в простой случай.

РЕДАКТИРОВАТЬ 2: Выяснили, почему это не сработало - вы можете использовать SqlDataReader.GetSchemaTable для получения информации о таблице, но вы должны установить для CommandBehavior значение KeyInfo, вы делаете это при вызове ExecuteReader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

Ответы [ 7 ]

10 голосов
/ 24 июня 2010

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

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
2 голосов
/ 23 июня 2010

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

2 голосов
/ 23 июня 2010

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

1 голос
/ 14 мая 2013

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

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]));
    }
}
1 голос
/ 24 июня 2010

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

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

Очевидно, что col1 происходит из нескольких таблиц.

0 голосов
/ 02 мая 2019
reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];
0 голосов
/ 05 июня 2016
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());
}
...