【问题标题】:How to get table name of a column from SqlDataReader如何从 SqlDataReader 获取列的表名
【发布时间】:2011-03-07 09:13:28
【问题描述】:

我有一个从配置文件中得到的 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 - 为什么需要这个?

标签: c# .net sql-server sqldatareader


【解决方案1】:

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

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        reader = cmd.ExecuteReader();
        reader.GetSchemaTable().Rows[0]["BaseTableName"];
        

        【讨论】:

          【解决方案5】:

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

          SELECT col1 FROM table1
          UNION ALL
          SELECT col1 FROM table2
          

          显然 col1 来自多个表。

          【讨论】:

            【解决方案6】:

            你可以像下面这样解决它:

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

            【讨论】:

              【解决方案7】:
              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());
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-10-12
                • 1970-01-01
                • 2013-07-18
                • 2015-04-04
                • 1970-01-01
                • 1970-01-01
                • 2012-12-06
                相关资源
                最近更新 更多