如何从SqlDataReader中获取列的表名

11
我从配置文件获取一个 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);

我不确定你是否能够基于结果集来完成这个任务。你可能需要解析SQL语句 - 你需要这么做吗? - Paddy
8个回答

15
您可以使用SqlDataReader.GetSchemaTable获取表信息,但您必须将CommandBehavior设置为KeyInfo,可在ExecuteReader调用中完成:
reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

3

这个未解决的问题在stackoverflow上使用SqlDataReader.GetSchemaTable来获取表名。他们的问题是它返回实际的表名而不是表的别名。不确定这是否适用于你的SQL,但我想让你知道。


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

2

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


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
如何获取数据库名称、表名称和列名称。还可以获取模式名称。在 MS SQL 2016 上进行了测试。
必须指定 CommandBehavior.KeyInfo。
        SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.KeyInfo);

        DataTable dataTable = sqlDataReader.GetSchemaTable();

        for (int i = 0; i < dataTable.Rows.Count - 1; i++)
        {
            string ii =
                dataTable.Rows[i]["BaseCatalogName"].ToString() + "\\" +
                dataTable.Rows[i]["BaseTableName"].ToString() + "\\" + 
                dataTable.Rows[i]["ColumnName"].ToString();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接