2010-09-23 12 views
6

quiero ir a buscar todos los nombres de las columnas de tabla específica ..ir a buscar nombres de columna para la tabla específica

estoy usando msaccess y C# .NET 2008.

+0

Debe proporcionar más información. ¿Cómo está accediendo a la base de datos? –

+0

@Daniel Esta es mi cadena de conexión .. string strConnection = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + System.Environment.CurrentDirectory + "\\ test.mdb"; –

+0

¿Estás usando 'SqlConnection' para acceder a la base de datos? –

Respuesta

23

Usted puede recuperar información de esquema para una consulta determinada a través OleDb utilizando el SchemaOnly CommandBehavior y el método GetSchemaTable, de la siguiente manera:

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

señor sus nombres de columna de vuelta con minúsculas como si tuviera columnname = OBJECTID pero está devolviendo objectid –

2

Esto recupera todas las columnas de todas las tablas y vistas

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

Una variante del método de bubi para una tabla específica:

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

Por supuesto principio es posible que desee comprobar si la tabla existe realmente antes de obtener sus nombres de columna:

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

encontré este artículo al intentar construir una aplicación C# para migrar una base de datos de Access. La base de datos que estoy migrando es un archivo de Access 2007/2010 con la extensión .accdb.

Si utiliza este código en una tabla que tiene columnas Memo o Adjunto (disponible en archivos accdb), devolverá el tipo de estas columnas como cadena (wchar).

tuve problemas para encontrar más información sobre cómo hacer frente a estos tipos de columnas, por lo que quería proporcionar un enlace al artículo que me ayudó a encontrar la manera de manejarlos:

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

I tomó el ejemplo inferior en ese hilo y lo convirtió a C#. Yo he de añadir esta instrucción using al módulo para evitar tener que modificar todas las referencias a "AccessDao":

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

Mis disculpas para virar hacia un viejo hilo, pero he utilizado este hilo como una partida punto para escribir mi código y no me di cuenta de esto inmediatamente.

Cuestiones relacionadas