2015-01-29 19 views
6

Tôi có thể sử dụng GetSchemaTableGetXMLSchema để nhận thông tin về các loại trường, kích cỡ, v.v. từ một FoxF DBF được mở bằng VFPOLEDB nhưng không thể nhận được bất kỳ thông tin nào liên quan đến chỉ mục nào trong bảng/CDX .Cách sử dụng VFPOLEDB để lấy thông tin DBF

Tôi không muốn sử dụng các chỉ mục, chỉ tiêu chí mà chỉ mục được xây dựng để hỗ trợ tôi trong việc tạo các lệnh SQL để tạo các bảng trên máy chủ SQL và nhập dữ liệu.

Tôi có thể thực hiện một đầu ra DISPLAY STRUCTURE thành tệp văn bản trên tất cả các bảng và phân tích cú pháp trong VB.NET nhưng tôi hy vọng có cái gì đó tôi đang xem như tôi không quen thuộc với cú pháp VB.NET/OLEDB .

Trả lời

4

Ít nghiên cứu đã cho kết quả này. Tôi đã bắt đầu với một cái nhìn tại ForeignKey.FKTableSchema Tài sản và tiếc là không phải là một tài sản .NET. Sau đó, mọi thứ có vẻ tốt khi tôi tìm thấy OleDbSchemaGuid.Indexes Field và mọi thứ đều tốt cho đến khi tôi chạy ứng dụng và đã nhận được phương thức Phương pháp này không được nhà cung cấp này hỗ trợ. Cuối cùng, bài viết sau thắp sáng con đường,

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

và tìm kiếm này

Các OleDb và các nhà cung cấp ODBC không cung cấp một built-in phương pháp catalô rằng sẽ trở lại phi-key Cột chỉ mục ("Đã bao gồm").

Tuy nhiên, đó là một số gợi ý thực sự thú vị cho phép viết ứng dụng Console nhỏ này để bạn thu thập các chỉ mục có sẵn trong bảng. Điều này đạt được bằng cách truy vấn trực tiếp bảng lược đồ từ SQL. Ví dụ sau là trên Employees bảng cơ sở dữ liệu mẫu Northwind nổi tiếng. Ở đây bạn đi,

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

và cuối cùng là kết quả,

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 

Tuy nhiên, sau này bằng cách loại bỏ các hạn chế tôi quản lý để vượt qua các Phương pháp không được hỗ trợ bởi nhà cung cấp này. lỗi và kết thúc tổng hợp nó lên như giải pháp ngắn này,

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

Những kết quả cho một đầu ra nhiều thời gian để sắp xếp ra nhưng một phần của nó sẽ là

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 
+0

Nếu tôi có thể upvote bạn ở đây tôi sẽ làm. Đây chính xác là những gì tôi cần. – CottonHill

1

Perfect! Mọi thứ tôi cần trích xuất. Vì nó nằm trong phần vb.net, tôi đã đăng mã thô của mình, tôi đã lọc các trường được trả về để tôi có thể liệt kê một vài trường ở đây. Nó trả về tất cả các thông tin thích hợp liên quan đến các chỉ mục, thậm chí cả các thông tin phức tạp được tạo ra với các biểu thức. Tất cả các bảng trong đường dẫn được cung cấp trong chuỗi kết nối có chỉ mục CDX sẽ được trả về.

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 
+0

Có. Cách tiếp cận tương tự là tốt. Tôi vui vì bạn đã sắp xếp nó. và kể từ khi tôi có thể upvote bạn, tôi sẽ sau đó bạn có thể nhận được đi. – Mehrad

+0

Tôi có một dự án Foxpro lớn để nâng cấp lên SQL.trợ giúp rất lớn ở đây, thậm chí có thể đọc các định nghĩa màn hình SCX và tự động tạo mã kiểm soát biểu mẫu và thậm chí dán nguồn FP vào các nút như mã nhận xét, các chỉ mục này là tất cả những gì tôi đã bỏ sót. – CottonHill

Các vấn đề liên quan