Как использовать метод GetOleDbSchemaTable для файла dbf с длинным именем - PullRequest
6 голосов
/ 30 марта 2009

Как часть проекта, над которым я работаю в 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 первой записью и выводить схему из столбцов.

Ответы [ 5 ]

2 голосов
/ 09 июня 2009

Согласно MSDN , папка представляет базу данных, а файлы представляют таблицы. Вы должны использовать путь к каталогу, не включая имя файла в строке подключения, и имя таблицы как часть ограничений для GetOleDbSchemaTable.

1 голос
/ 15 апреля 2009

Ну, я думаю, что соединение должно быть

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

а другой, может быть, вам стоит попробовать с другим провайдером, я много раз повышал его, когда использовал вот так:

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

Но у вас должен быть установлен VFP 7

или установить отсюда Microsoft OLE DB Provider для Visual FoxPro 9.0

        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 голосов
/ 10 июня 2009

Я считаю, что DataSource должен представлять каталог, содержащий файлы .DBF. Каждый файл .DBF соответствует таблице в этом каталоге.

Я предполагаю, что c: \ MyLongF ~ 1 - короткое имя для каталога, содержащего имя файла, соответствующее MyLongF ~ 1 # DBF

Можете ли вы проверить, так ли это на самом деле?

0 голосов
/ 09 июня 2009

Если у вас есть один (и, возможно, небольшой) файл dbf, вы можете решить проблему, скопировав файл dbf в другом месте и открыть копию вместо исходного файла.

0 голосов
/ 04 июня 2009

fileNameNoExt содержит версию короткого имени файла? Кроме того, MyLongF ~ 1 составляет 9 символов, а не 8.

...