2010-09-23 70 views
6

我要爲特定表獲取所有的列名..取列名的特定表

我使用MSACCESS和C#.NET 2008

+0

您需要提供更多信息。你如何訪問數據庫? – 2010-09-23 02:44:38

+0

@Daniel這是我的連接字符串.. string strConnection =「Provider = Microsoft.Jet.OLEDB.4.0; Data Source =」+ System.Environment.CurrentDirectory +「\\ test.mdb」; – 2010-09-23 02:48:35

+0

你使用'SqlConnection'來訪問數據庫嗎? – 2010-09-23 02:54:16

回答

23

您可以通過給定查詢獲取架構信息的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]); 
     } 
    } 
} 
+0

sir其返回列名與小寫像我有columnname = OBJECTID但它是返回objectid – 2015-11-17 11:35:50

2

此檢索所有表的所有列和視圖

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

布比的方法的特定表的變體:

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

我道歉,用於定位到一個古老的線程,但我用這個線程爲出發寫我的代碼點,並沒有立即意識到這個問題。

相關問題