2010-11-05 26 views
2

Je suis en train de porter une application basée sur la base de données VB6 reposant sur ADO vers C# (en s'appuyant sur ADO.NET). Le schéma des bases de données cet accès d'application sont arbitraires et je compte sur DbConnection.GetSchema pour récupérer des informations. Aussi près que je peux dire (Et voici où j'ai besoin d'aide), GetSchema est censé remplacer le ADOX.Catalog. Alors, voici ce que j'ai (désolé pour le formatage!):Comment pouvez-vous indiquer l'ordre dans lequel DbConnection.GetSchema renvoie ses valeurs?

List<string> temp = new List<string>(); 
string[] restrictions = new string[4] { null, null, tableName, null }; 
using (SqlConnection databaseConnection = new SqlConnection(connString)) 
{ 
    databaseConnection.Open(); 
    foreach (DataRow row in databaseConnection.GetSchema(
       SqlClientMetaDataCollectionNames.Columns, restrictions).Rows) 
    { 
     temp.Add(row["COLUMN_NAME"] as string); 
    } 
} 

Je sais pertinemment que cela remplit correctement temp les noms des colonnes de la table nommée tableName. Cependant, l'ordre semble arbitraire, alors qu'avec ADOX.Catalog, la commande est exactement la même que celle trouvée dans Sql Management Studio. Voici comment l'original le fait:

Dim cat As New ADOX.Catalog 
Dim T As ADOX.Table 
Dim C As ADOX.Column 

Set cat.ActiveConnection = conn 

'retrieve list of fields for this table' 
Set T = cat.Tables(tableName) 

For Each C In T.Columns 
    temp.Add C.Name 

Next 

Ils sortent dans des ordres différents, et je ne suis pas sûr de quoi faire à ce sujet!

Ma question est essentiellement: Est-ce que ADO.NET a un remplacement pour ADOX.Catalog autre que GetSchema? Si ce n'est pas le cas, comment puis-je commander GetSchema pour ne pas avoir de commandes aléatoires (cela va embrouiller mes collègues qui utilisent si mal!)

Répondre

2

Vous pouvez utiliser la méthode DataTable.Select pour classer les résultats :

databaseConnection.Open(); 
DataTable columns = databaseConnection.GetSchema(
      SqlClientMetaDataCollectionNames.Columns, restrictions); 
foreach (DataRow row in columns.Select("", "COLUMN_NAME")) 
{ 
    temp.Add(row["COLUMN_NAME"] as string); 
}