Как получить имя таблицы столбца из 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());
}