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.
Đ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 đề. –