如何使用VFPOLEDB获取DBF信息

时间:2015-01-29 19:23:26

标签: vb.net oledb foxpro visual-foxpro

我可以使用GetSchemaTableGetXMLSchema从使用VFPOLEDB打开的Foxpro DBF获取有关字段类型,大小等的信息,但无法获取有关表/ CDX中的索引的任何信息

我不想使用索引,只是构建索引的标准,以帮助我生成SQL命令以在SQL服务器上创建表并导入数据。

我可以对所有表格上的文本文件进行DISPLAY STRUCTURE输出并在VB.NET中解析但是我希望有一些我可以忽略的东西因为我对VB.NET不熟悉还有OLEDB语法。

2 个答案:

答案 0 :(得分:4)

一些研究结果给出了这些结果。我开始看看ForeignKey.FKTableSchema属性,不幸的是不是.NET属性。后来当我找到OleDbSchemaGuid.Indexes Field并且一切看起来都很好,直到我运行应用程序并且得到 方法不受此提供程序支持时,事情看起来很好。 最终以下内容文章照亮了路,

GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Indexes - How to access included columns on index

和这个发现

  

OleDb和Odbc提供程序不提供内置目录方法   这将返回非键("包含")索引列。

然而,这是一个非常有趣的建议,让你可以编写这个小的控制台应用程序来收集表中可用的索引。这是通过直接从SQL查询模式表来实现的。以下示例位于着名的Employees示例数据库的Northwind表中。你去吧,

//Open a connection to the SQL Server Northwind database.
var connectionString =
    "Provider=SQLOLEDB;Data Source=SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;Encrypt=False;TrustServerCertificate=False";

using (var connection = new OleDbConnection(connectionString))
{
    connection.Open();

    var select = "SELECT " +
        "    T.name                  AS TABLE_NAME" +
        "  , IX.name                 AS INDEX_NAME" +
        "  , IC.index_column_id      AS IX_COL_ID" +
        "  , C.name                  AS COLUMN_NAME" +
        "  , IC.is_included_column   AS INCLUDED_NONKEY" +
        "  " +
        "FROM " +
        "    sys.tables T " +
        "    INNER JOIN sys.indexes IX" +
        "        ON T.object_id = IX.object_id     " +
        "    INNER JOIN sys.index_columns IC" +
        "        ON IX.object_id = IC.object_id " +
        "        AND IX.index_id = IC.index_id " +
        "    INNER JOIN sys.columns C" +
        "        ON IC.object_id = C.object_id " +
        "        AND IC.column_id = C.column_id " +
        "  " +
        "WHERE T.name = 'Employees'" +
        "ORDER BY IC.index_column_id";
    OleDbCommand cmd = new OleDbCommand(@select, connection);
    cmd.CommandType = CommandType.Text;
    var outputTable = new DataSet("Table");
    var my = new OleDbDataAdapter(cmd).Fill(outputTable);

    foreach (DataTable table in outputTable.Tables)
    {
        foreach (DataRow myField in table.Rows)
        {
            //For each property of the field...
            foreach (DataColumn myProperty in table.Columns)
            {
                //Display the field name and value.
                Console.WriteLine(myProperty.ColumnName + " = " +
                                  myField[myProperty].ToString());
            }
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

最后是结果,

TABLE_NAME = Employees
INDEX_NAME = PK_Employees
IX_COL_ID = 1
COLUMN_NAME = EmployeeID
INCLUDED_NONKEY = False

TABLE_NAME = Employees
INDEX_NAME = LastName
IX_COL_ID = 1
COLUMN_NAME = LastName
INCLUDED_NONKEY = False

TABLE_NAME = Employees
INDEX_NAME = PostalCode
IX_COL_ID = 1
COLUMN_NAME = PostalCode
INCLUDED_NONKEY = False

然而,稍后通过删除我设法克服的限制 方法不受此提供商支持。 错误并最终将其总结为此更短的解决方案,

//Open a connection to the SQL Server Northwind database.
var connectionString =
    "Provider=SQLOLEDB;Data Source=SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;Encrypt=False;TrustServerCertificate=False";

using (OleDbConnection cnn = new OleDbConnection(connectionString))
{
    cnn.Open();
    DataTable schemaIndexess = cnn.GetSchema("Indexes",
        new string[] {null, null, null});
    DataTable schemaIndexes = cnn.GetOleDbSchemaTable(
        OleDbSchemaGuid.Indexes,
        new object[] {null, null, null});

    foreach (DataRow myField in schemaIndexes.Rows)
    {
        //For each property of the field...
        foreach (DataColumn myProperty in schemaIndexes.Columns)
        {
            //Display the field name and value.
            Console.WriteLine(myProperty.ColumnName + " = " +
                              myField[myProperty].ToString());
        }
        Console.WriteLine();
    }


    Console.ReadLine();
}

这导致更长的输出要整理,但部分结果将是

TABLE_CATALOG = Northwind
TABLE_SCHEMA = dbo
TABLE_NAME = Employees
INDEX_CATALOG = Northwind
INDEX_SCHEMA = dbo
INDEX_NAME = LastName
PRIMARY_KEY = False
UNIQUE = False
CLUSTERED = False
TYPE = 1
FILL_FACTOR = 0
INITIAL_SIZE =
NULLS =
SORT_BOOKMARKS = False
AUTO_UPDATE = True
NULL_COLLATION = 4
ORDINAL_POSITION = 1
COLUMN_NAME = LastName
COLUMN_GUID =
COLUMN_PROPID =
COLLATION = 1
CARDINALITY =
PAGES = 1
FILTER_CONDITION =
INTEGRATED = False

答案 1 :(得分:1)

完美! 我需要提取的一切。由于它是在vb.net部分我发布了我的粗略代码,我过滤了返回的字段,所以我可以在这里列出一些。 它返回与索引相关的所有相关信息,甚至是使用表达式创建的复杂信息。

将返回连接字符串中提供的带CDX索引的路径中的所有表
 TABLE_NAME = schematest
 INDEX_NAME = char3ascen
 NULLS = 1
 EXPRESSION = char3ascen

 TABLE_NAME = schematest
 INDEX_NAME = expressn
 NULLS = 2
 EXPRESSION = LEFT(char1null,4)+SUBSTR(char2,4,2)

 TABLE_NAME = schematest
 INDEX_NAME = multifld
 NULLS = 2
 EXPRESSION = char1null+char2

 TABLE_NAME = customer
 INDEX_NAME = zip
 NULLS = 1
 EXPRESSION = zip


    Private Sub GetIndexInfo_Click(sender As Object, e As EventArgs) Handles GetIndexInfo.Click
    Dim cnnOLEDB As New OleDbConnection
    Dim SchemaTable As DataTable
    Dim myField As DataRow
    Dim myProperty As DataColumn
    Dim ColumnNames As New List(Of String)
    Dim strConnectionString = "Provider=vfpoledb;Data Source=D:\ACW\;Collating Sequence=general;DELETED=False"
    cnnOLEDB.ConnectionString = strConnectionString
    cnnOLEDB.Open()
    ColumnNames.Add("TABLE_NAME")
    columnnames.Add("INDEX_NAME")
    columnnames.Add("NULLS")
    columnnames.Add("TYPE")
    columnnames.Add("EXPRESSION")

    SchemaTable = cnnOLEDB.GetSchema("Indexes")
    'For Each myProperty In SchemaTable.Columns
    For Each myField In SchemaTable.Rows
        For Each myProperty In SchemaTable.Columns
            If ColumnNames.Contains(myProperty.ColumnName) Then
                Console.WriteLine(myProperty.ColumnName & " = " & myField(myProperty).ToString)
            End If
        Next
        Console.WriteLine()
    Next
    Console.ReadLine()
    DGVSchema.DataSource = SchemaTable

End Sub