【问题标题】:fetch column names for specific table获取特定表的列名
【发布时间】:2011-04-16 01:25:48
【问题描述】:

我想获取特定表的所有列名..

我正在使用 msaccess 和 C# .net 2008。

【问题讨论】:

  • 您需要提供更多信息。您如何访问数据库?
  • @Daniel 这是我的连接字符串.. string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Environment.CurrentDirectory + "\\test.mdb";
  • 您是否使用SqlConnection 访问数据库?
  • @Daniel 我正在使用 OleDb 访问数据库。对不起,我是 .net 新手。

标签: c# database ms-access schema oledb


【解决方案1】:

您可以使用 SchemaOnly CommandBehaviorGetSchemaTable 方法通过 OleDb 获取给定查询的架构信息,如下所示:

var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb";
using (var con = new OleDbConnection(conStr))
{
    con.Open();
    using (var cmd = new OleDbCommand("select * from Suppliers", con))
    using (var reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
    {
        var table = reader.GetSchemaTable();
        var nameCol = table.Columns["ColumnName"];
        foreach (DataRow row in table.Rows)
        {
            Console.WriteLine(row[nameCol]);
        }
    }
}

【讨论】:

  • 先生,它返回的列名是小写的,就像我有 columnname = OBJECTID 但它正在返回 objectid
【解决方案2】:

针对特定表的 bubi 方法的变体:

public List<string> GetTableColumnNames(string tableName)
{
  var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb";
  using (var connection = new OleDbConnection(conStr))
  {
    connection.Open();
    var schemaTable = connection.GetOleDbSchemaTable(
      OleDbSchemaGuid.Columns,
      new Object[] { null, null, tableName });
    if (schemaTable == null)
      return null;

    var columnOrdinalForName = schemaTable.Columns["COLUMN_NAME"].Ordinal;

    return (from DataRow r in schemaTable.Rows select r.ItemArray[columnOrdinalForName].ToString()).ToList();
  }
}

当然,首先您可能想在获取其列名之前检查该表是否确实存在:

public bool TableExists(string tableName)
{
  var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb";      
  using (var connection = new OleDbConnection(conStr))
  {
    connection.Open();
    var tables = connection.GetSchema("Tables");
    var tableExists = false;
    for (var i = 0; i < tables.Rows.Count; i++)
    {
      tableExists = String.Equals(tables.Rows[i][2].ToString(),
                           tableName,
                           StringComparison.CurrentCultureIgnoreCase);
      if (tableExists)
        break;
    }
    return tableExists;
  }
}

【讨论】:

    【解决方案3】:

    这会检索所有表和视图的所有列

            DataTable schemaTable = ((OleDbConnection)jetConnection).GetOleDbSchemaTable(
              System.Data.OleDb.OleDbSchemaGuid.Columns,
              new object[] { null, null, null, null });
    

    【讨论】:

      【解决方案4】:

      我在尝试构建 C# 应用程序以迁移 Access 数据库时发现了这篇文章。我要迁移的数据库是一个带有 .accdb 扩展名的 Access 2007/2010 文件。

      如果您在具有备注或附件列(在 accdb 文件中可用)的表上使用此代码,它将以字符串 (wchar) 形式返回这些列的类型。

      我很难找到有关如何处理这些类型的列的大量信息,因此我想提供一个链接,指向这篇文章,帮助我弄清楚如何处理它们:

      https://social.msdn.microsoft.com/Forums/vstudio/en-US/d15606f9-f38d-4a1b-8ce3-000c558e79c5

      我采用了该线程中的底部示例并将其转换为 C#。我确实必须将此 using 语句添加到模块中,以避免编辑对“AccessDao”的所有引用:

      using AccessDao = Microsoft.Office.Interop.Access.Dao;
      

      抱歉,我使用了一个旧线程,但我使用这个线程作为编写代码的起点,并没有立即意识到这个问题。

      【讨论】:

        【解决方案5】:

        这里的代码按照它们在 Access 表中出现的顺序获取列名。此处其他答案中的示例按字母顺序返回列名(至少对我而言...使用 Microsoft Access Database Engine 2016 Redistributable 和 .NET Core 3.1)。

        基于qnaninf的代码示例:

        var schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tableName });
        var columnOrdinalForName = schemaTable.Columns["COLUMN_NAME"].Ordinal;
        var columnOrdinalForOrdinal = schemaTable.Columns["ORDINAL_POSITION"].Ordinal;
        var rows = schemaTable.Rows;
        var columns = from DataRow r in schemaTable.Rows
                        orderby r.ItemArray[columnOrdinalForOrdinal]
                        select new
                        {
                            Ordinal = r.ItemArray[columnOrdinalForOrdinal].ToString(),
                            ColumnName = r.ItemArray[columnOrdinalForName].ToString()
                        };
        

        【讨论】:

          猜你喜欢
          • 2013-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          相关资源
          最近更新 更多