如何从SqlDataReader获取列的表名

问题描述 投票:8回答:7

我从配置文件中获得了一个SQL查询,此查询通常包含3-6个连接。

我需要在运行时根据SqlDataReader表示的结果集找到每个列的表名。

以下是一些不起作用的东西:

  • SqlDataReader.GetName返回列名但不返回表名。
  • SqlDataReader.GetSchemaTable返回包含列信息的数据表 - 但所有表名都为null。
  • 查询information_schema没有帮助,因为我需要有关当前查询结果的数据(并且列名不是唯一的 - 在不同的表中有相同名称的列)。

我在控制台应用程序中使用.net 3.5SP1 / C#/ SQL Server 2008。

编辑:我知道这对所有情况都不可能,因为“列”可以从多个表,一个函数或一个常量表达式组合 - 我正在寻找一些在简单情况下有效的东西。

编辑2:找出它无法工作的原因 - 您可以使用SqlDataReader.GetSchemaTable获取表信息,但是您必须将CommandBehavior设置为KeyInfo,您可以在ExecuteReader调用中执行此操作:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
c# .net sql-server sqldatareader
7个回答
10
投票

您可以使用SqlDataReader.GetSchemaTable来获取表信息,但是您必须将CommandBehavior设置为KeyInfo,您可以在ExecuteReader调用中执行此操作:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

2
投票

我不知道这些信息是否可用。特别是,并非结果集的所有列都来自表。从关系的角度来看,表和结果集是相同的。


2
投票

stackoverflow上的这个unanswered question使用SqlDataReader.GetSchemaTable来获取表名。他们的问题是它返回实际的表名而不是表所具有的别名。不确定这是否适用于您的sql,但我想我会告诉您以防万一。


1
投票

一般来说,这是不可能的。请考虑以下查询:

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

很明显,col1来自多个表。


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

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

0
投票
reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.