如何指示DbConnection.GetSchema返回其值的顺序?

时间:2010-11-05 20:18:05

标签: c# ado.net ado vb6-migration

我正在将依赖于ADO的VB6以数据库为中心的应用程序移植到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

他们以不同的顺序出现,我不知道该怎么做!

我的问题基本上是:除了GetSchema之外,ADO.NET是否可以替代ADOX.Catalog?如果不是,我怎么能订购GetSchema以便我不会随机排序(这会让那些使用它的同事感到困惑!)

1 个答案:

答案 0 :(得分:2)

您可以使用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);
}