2009-03-30 21 views
6

Là một phần của dự án tôi đang làm việc trong C# Tôi cần đọc trong tệp .dbf. Điều đầu tiên tôi muốn làm là lấy bảng lược đồ từ tệp. Tôi có mã hoạt động miễn là tên tệp (không có phần mở rộng) không dài quá 8 ký tự.Cách sử dụng phương thức GetOleDbSchemaTable trên tên tệp dbf dài

Ví dụ: giả sử tôi có tệp có tên MyLongFilename.dbf. Mã sau đây không hoạt động; nó ném ngoại lệ sau: “Cơ sở dữ liệu Microsoft Jet không thể tìm thấy đối tượng 'MyLongFilename'. Hãy chắc chắn rằng đối tượng tồn tại và rằng bạn đánh vần tên của nó và tên đường dẫn chính xác.”

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

Để vượt qua ngoại lệ này, bước tiếp theo là sử dụng một tên OldDbConnection thích ('MyLongF ~ 1' thay vì 'MyLongFilename'), dẫn đến điều này:

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

Điều này trả lại thành công một OleDbConnection. Bây giờ để có được bảng lược đồ tôi thử các bước sau:

connection.Open(); 
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
    new object[] { null, null, fileNameNoExt, null }); 

Điều này trả về một DataTable không có hàng. Nếu tôi đổi tên tập tin thành 8 hoặc ít ký tự thì mã này hoạt động và tôi lấy lại một hàng cho mỗi trường trong cơ sở dữ liệu.

Với tên tập tin dài, tôi biết kết nối trở lại là hợp lệ vì tôi có thể sử dụng nó để điền vào một DataSet như vậy:

string selectQuery = "SELECT * FROM [MyLongF~1#DBF];"; 
OleDbCommand command = new OleDbCommand(selectQuery, connection); 
connection.Open(); 
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 
dataAdapter.SelectCommand = command; 
DataSet dataSet = new DataSet(); 
dataAdapter.Fill(dataSet); 

này mang lại cho tôi trở lại một DataSet chứa một DataTable với tất cả các dữ liệu từ tệp dbf.

Vì vậy, câu hỏi là làm thế nào tôi có thể nhận được chỉ là bảng lược đồ cho tệp dbf có tên dài? Tất nhiên tôi có thể giải quyết vấn đề bằng cách đổi tên/sao chép tệp, nhưng đó là một hack tôi không muốn phải thực hiện. Tôi cũng không muốn điền vào DataSet với bản ghi đầu tiên 1 và suy ra lược đồ từ các cột.

Trả lời

1

Vâng, tôi nghĩ rằng kết nối nên

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

và thứ hai là, có lẽ bạn nên thử với nhà cung cấp khác, tôi đẩy mạnh rất nhiều cùng trước khi tôi sử dụng như thế này:

string cxn = "PROVIDER=VFPOLEDB.1;Data Source=C:\;Extended Properties=dBASE 5.0"; 

Nhưng bạn nên có VFP 7 cài đặt

hoặc install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

 const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;"; 
     OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName)); 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn); 
0

TệpNameNoExt có giữ phiên bản tên tệp ngắn không? Ngoài ra, MyLongF ~ 1 là 9 ký tự, không 8.

2

Theo MSDN, thư mục đại diện cho cơ sở dữ liệu và các tập tin đại diện cho bảng. Bạn nên sử dụng đường dẫn thư mục không bao gồm tên tệp trong chuỗi kết nối, và tên của bảng như là một phần của các hạn chế đối với GetOleDbSchemaTable.

+0

Điều này có vẻ là một vấn đề, nhưng không giải thích được tất cả các vấn đề. –

0

Nếu bạn có tệp dbf đơn (và có thể nhỏ), bạn có thể giải quyết vấn đề sao chép tệp dbf ở nơi khác và mở bản sao thay vì tệp gốc.

0

Tôi tin rằng DataSource phải đại diện cho thư mục chứa tệp .DBF. Mỗi .Tệp DBF tương ứng với một bảng trong thư mục đó.

tôi đoán là c: \ MyLongF ~ 1 là một tên viết tắt của một thư mục có chứa một tên tập tin tương ứng với MyLongF ~ 1 # DBF

Bạn có thể xác minh có hay không đây là trường hợp?

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