2010-09-23 15 views
6

Chcę pobrać wszystkie nazwy kolumn dla określonej tabeli ..pobrać nazwy kolumn dla określonej tabeli

używam MSACCESS i C# .NET 2008.

+0

Musisz podać więcej informacji. W jaki sposób uzyskujesz dostęp do bazy danych? –

+0

@Daniel To jest mój ciąg połączenia .. ciąg strConnection = "Dostawca = Microsoft.Jet.OLEDB.4.0; Źródło danych =" + System.Environment.CurrentDirectory + "\\ test.mdb"; –

+0

Czy używasz 'SqlConnection' do dostępu do bazy danych? –

Odpowiedz

23

można pobrać informacje o schemacie dla danego zapytania poprzez OleDb pomocą SchemaOnly CommandBehavior oraz metodę GetSchemaTable, co następuje:

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 powracające nazwy kolumn z małymi literami jak i columnname = OBJECTID, ale zwraca obiekt objectid –

2

ten pobiera wszystkie kolumny wszystkich tabel i widoków

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

Wariant sposobu Bubi dla określonej tabeli:

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

Oczywiście najpierw warto sprawdzić, czy tabela rzeczywiście istnieje, zanim się jego nazwy kolumn:

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

znalazłem to podczas próby zbudowania aplikacji C# do migracji bazy danych Access. Migrowana baza danych to plik programu Access 2007/2010 z rozszerzeniem .accdb.

Jeśli użyjesz tego kodu w tabeli, która ma kolumny Memo lub Attachment (dostępne w plikach accdb), zwróci typ tych kolumn jako łańcuch (wchar).

miałem problemy ze znalezieniem wiele informacji o tym, jak radzić sobie z tych typów kolumn, więc chciałem podać link do artykułu, który pomógł mi dowiedzieć się, jak sobie z nimi radzić:

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

I wziął dolny przykład w tym wątku i przekonwertował go do C#. I musiał dodać za pomocą komunikatu do modułu, aby uniknąć konieczności edytować wszystkie odniesienia do „AccessDao”:

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

moje przeprosiny za sklejaniu na starym wątku, ale kiedyś ten wątek jako rozruch punkt za napisanie mojego kodu i nie zdawałem sobie sprawy, że to od razu.

Powiązane problemy