获取特定表的列名

时间:2010-09-23 02:30:56

标签: c# database ms-access schema oledb

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

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

4 个答案:

答案 0 :(得分:24)

您可以使用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]);
        }
    }
}

答案 1 :(得分:3)

针对特定表格的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;
  }
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

如果在具有“备注”或“附件”列(在accdb文件中可用)的表上使用此代码,则会将这些列的类型返回为字符串(wchar)。

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

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

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

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

对于加入一个旧线程我表示道歉,但我使用这个帖子作为编写代码的起点,并没有立即意识到这一点。