получить имена столбцов для конкретной таблицы - PullRequest
6 голосов
/ 23 сентября 2010

Я хочу получить все имена столбцов для конкретной таблицы.

Я использую msaccess и C # .net 2008.

Ответы [ 4 ]

24 голосов
/ 23 сентября 2010

Вы можете получить информацию о схеме для данного запроса через OleDb, используя метод SchemaOnly CommandBehavior и GetSchemaTable , следующим образом:

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]);
        }
    }
}
3 голосов
/ 26 апреля 2016

Вариант метода Буби для конкретной таблицы:

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 голосов
/ 20 ноября 2014

Получает все столбцы всех таблиц и представлений

        DataTable schemaTable = ((OleDbConnection)jetConnection).GetOleDbSchemaTable(
          System.Data.OleDb.OleDbSchemaGuid.Columns,
          new object[] { null, null, null, null });
0 голосов
/ 13 мая 2016

Я нашел эту статью, пытаясь создать приложение C # для переноса базы данных Access.База данных, которую я переношу, - это файл Access 2007/2010 с расширением .accdb.

Если вы используете этот код в таблице, содержащей столбцы 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;

Мои извинения за привязку к старому потоку, но я использовал этонить в качестве отправной точки для написания моего кода, и я не сразу понял, что понял.

...