Как вы можете указать порядок, в котором DbConnection.GetSchema возвращает свои значения? - PullRequest
2 голосов
/ 05 ноября 2010

Я портирую приложение, ориентированное на базу данных VB6, полагаясь на ADO, на C # (полагаясь на ADO.NET). Схема баз данных, к которым это приложение обращается, произвольна, и я полагаюсь на DbConnection.GetSchema для получения информации.

Насколько я могу судить (и здесь мне нужна помощь), GetSchema должен заменить ADOX.Catalog. Итак, вот что у меня есть (извините за форматирование!):

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

Я точно знаю, что это правильно заполняет temp именами столбцов для таблицы с именем tableName. Тем не менее, порядок выглядит произвольным, тогда как в ADOX.Catalog порядок точно такой же, как в Sql Management Studio. Вот как это делает оригинал:

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

Они выходят в разных порядках, и я не уверен, что с этим делать!

Мой вопрос в основном: есть ли в ADO.NET замена на ADOX.Catalog, кроме GetSchema? Если это не так, как я могу заказать GetSchema, чтобы я не получал случайный заказ (это может смутить моих коллег, которые так плохо это используют!)

1 Ответ

2 голосов
/ 05 ноября 2010

Вы можете использовать метод DataTable.Select для заказа результатов:

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