如何从SqlDataReader获取列的表名

时间:2010-06-23 15:08:05

标签: c# .net sql-server sqldatareader

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

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

以下是一些不起作用的事情:

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

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

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

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

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

7 个答案:

答案 0 :(得分:10)

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

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

很明显,col1来自多个表。

答案 4 :(得分: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]));
    }
}

答案 5 :(得分: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());
}

答案 6 :(得分:0)

reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];