获取特定表的列名

10

我希望获取特定表的所有列名。

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


你需要提供更多信息。你是通过什么方式访问数据库的? - Daniel T.
@Daniel 这是我的连接字符串.. 字符串 strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Environment.CurrentDirectory + "\test.mdb"; - krunal shah
你是否正在使用 SqlConnection 访问数据库? - Daniel T.
@Daniel 我正在使用OleDb来访问数据库。抱歉,我是.NET的新手。 - krunal shah
6个回答

31

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

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

先生,它将列名返回为小写字母,比如我的列名是OBJECTID,但它返回的是objectid。 - Muneem Habib

4
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

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

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

0

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

如果您在具有Memo或Attachment列(在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;

非常抱歉在一个旧的线程上跟帖,但我以这个线程为起点编写我的代码,并没有立刻意识到这个陷阱。


0
以下是获取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()
                };

0

您可以按照以下方式从MS Access数据库中获取Vb.net和Oledb的列名。

  'In Vb.net with OleDb


    Dim adapter As new OleDb.OleDbDataAdapter
    Dim ds As New DataSet
    cmd.CommandText = "select * from table_name where 1=2"

    adapter.SelectCommand = cmd
    adapter.Fill(ds)
    adapter.Dispose()
    cmd.Dispose()


    For Each dr In ds.Tables(0).Columns
        ComboBox1.Items.Add(dr.ToString) 'The Column name will come in this combobox
    Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接