10

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

7 回答 7

12

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

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
于 2010-06-24T13:25:47.327 回答
3

这个关于 stackoverflow 的未回答问题使用 SqlDataReader.GetSchemaTable 来获取表名。他们的问题是它返回实际的表名而不是表的别名。不确定这是否适用于您的 sql,但我想以防万一。

于 2010-06-23T15:32:32.207 回答
2

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

于 2010-06-23T15:10:30.883 回答
2
reader = cmd.ExecuteReader();
reader.GetSchemaTable().Rows[0]["BaseTableName"];
于 2019-05-01T22:34:07.923 回答
1

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

SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2

显然 col1 来自不止一个表。

于 2010-06-24T15:04:31.793 回答
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]));
    }
}
于 2013-05-14T08:51:06.630 回答
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());
}
于 2016-06-05T16:56:16.983 回答