代码之家  ›  专栏  ›  技术社区  ›  Nir

如何从SqlDataReader获取列的表名

  •  8
  • Nir  · 技术社区  · 16 年前

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

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

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

    • SqlDataReader.GetName返回列名,但不返回表名。

    我正在控制台应用程序中使用.NET3.5SP1/C#/SQLServer2008。

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

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

    reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
    
    6 回复  |  直到 16 年前
        1
  •  11
  •   Nir    16 年前

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

    reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
    
        2
  •  2
  •   John Saunders    16 年前

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

        3
  •  2
  •   Community Mohan Dere    9 年前

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

        4
  •  2
  •   Madacol    7 年前
    reader = cmd.ExecuteReader();
    reader.GetSchemaTable().Rows[0]["BaseTableName"];
    
        5
  •  1
  •   A-K    16 年前

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

    SELECT col1 FROM table1
    UNION ALL
    SELECT col1 FROM table2
    

    显然,col1来自多个表。

        6
  •  1
  •   Brad Larson    12 年前

    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
  •  0
  •   The_Black_Smurf Goutham    10 年前
    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());
    }
    
    推荐文章