2010-09-23 22 views
6

Je veux aller chercher tous les noms de colonnes de la table spécifique ..chercher les noms de colonnes pour la table spécifique

J'utilise msaccess et C# .net 2008.

+0

Vous devez fournir plus d'informations. Comment accédez-vous à la base de données? –

+0

@Daniel Ceci est ma chaîne de connexion .. chaîne strConnection = "Fournisseur = Microsoft.Jet.OLEDB.4.0; Source de données =" + System.Environment.CurrentDirectory + "\\ test.mdb"; –

+0

Utilisez-vous 'SqlConnection' pour accéder à la base de données? –

Répondre

23

Vous pouvez chercher des informations de schéma pour une requête donnée par OleDb en utilisant la SchemaOnly CommandBehavior et la méthode GetSchemaTable, comme suit:

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 son retournant les noms de colonne en minuscules comme j'ai columnname = OBJECTID mais il retourne objectid –

2

Cette récupère toutes les colonnes de toutes les tables et vues

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

Une variante de la méthode de Bubi pour une table spécifique:

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

Bien sûr d'abord vous pourriez vouloir vérifier si la table existe réellement avant d'obtenir ses noms de colonnes:

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

J'ai trouvé article tout en essayant de construire une application C# pour migrer une base de données Access. La base de données que je migre est un fichier Access 2007/2010 avec l'extension .accdb.

Si vous utilisez ce code sur une table contenant des colonnes Mémo ou Pièce jointe (disponible dans les fichiers accdb), le type de ces colonnes sera renvoyé sous forme de chaîne (wchar).

J'ai eu du mal à trouver beaucoup d'informations sur la façon de traiter ces types de colonnes, donc je voulais fournir un lien vers l'article qui m'a aidé à comprendre comment les gérer:

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

I a pris l'exemple du bas dans ce fil et l'a converti en C#. Je ne dois ajouter cette instruction à l'aide du module pour éviter d'avoir à modifier toutes les références à « AccessDao »:

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

Mes excuses pour clouer sur un vieux fil, mais j'ai utilisé ce fil comme départ point pour l'écriture de mon code et n'a pas réalisé ce gotcha tout de suite.