Как часть проекта, над которым я работаю в C #, мне нужно читать в файле .dbf. Первое, что я хочу сделать, это получить таблицу схемы из файла. У меня есть код, который работает, пока имя файла (без расширения) не длиннее 8 символов.
Например, допустим, у меня есть файл с именем MyLongFilename.dbf. Следующий код не работает; он выдает следующее исключение: «ядру базы данных Microsoft Jet не удалось найти объект« MyLongFilename ». Убедитесь, что объект существует, и что вы правильно написали его имя и путь. ”
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
Чтобы обойти это исключение, следующим шагом является использование имени, которое нравится OldDbConnection («MyLongF ~ 1» вместо «MyLongFilename»), что приводит к этому:
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
Это успешно возвращает OleDbConnection. Теперь, чтобы получить таблицу схем, я пробую следующее:
connection.Open();
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
new object[] { null, null, fileNameNoExt, null });
Возвращает таблицу данных без строк. Если я переименую имя файла в 8 или менее символов, то этот код сработает, и я получу строку для каждого поля в базе данных.
С длинным именем файла я знаю, что возвращаемое соединение допустимо, потому что я могу использовать его для заполнения DataSet следующим образом:
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);
Это возвращает мне DataSet, содержащий DataTable со всеми данными из файла dbf.
Итак, вопрос в том, как я могу получить только таблицу схем для файла dbf с длинным именем? Конечно, я могу обойти эту проблему, переименовав / скопировав файл, но я не хочу этого делать. Также я не хочу заполнять DataSet первой записью и выводить схему из столбцов.