Chcę pobrać wszystkie nazwy kolumn dla określonej tabeli ..pobrać nazwy kolumn dla określonej tabeli
używam MSACCESS i C# .NET 2008.
Chcę pobrać wszystkie nazwy kolumn dla określonej tabeli ..pobrać nazwy kolumn dla określonej tabeli
używam MSACCESS i C# .NET 2008.
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]);
}
}
}
sir powracające nazwy kolumn z małymi literami jak i columnname = OBJECTID, ale zwraca obiekt objectid –
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 });
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;
}
}
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.
Musisz podać więcej informacji. W jaki sposób uzyskujesz dostęp do bazy danych? –
@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"; –
Czy używasz 'SqlConnection' do dostępu do bazy danych? –