2013-03-26 6 views
2

я читаю файл DBF, используя OLEDB таким образом:ADO.NET OleDB и очень старый Dbase IV файл

[TestMethod] 
public void TestMethod2() 
{ 
    const string path = @"D:\VL816183.DBF"; 

    var connection = new OleDbConnection(string.Format("Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\"", Path.GetDirectoryName(path))); 
    connection.Open(); 

    var command = new OleDbCommand(string.Format("select MNO from {0}", Path.GetFileName(path)), connection); 

    using (var reader = command.ExecuteReader()) 
    { 
    while (reader.Read()) 
    { 
     var str = (string)reader["MNO"]; 

    } 
    } 

    connection.Close(); 
} 

Все, кажется, в порядке, но есть проблема с строковыми данными. Исходная база данных содержит строки, сохраненные с CodePage = 852, и я не могу найти способ правильно ее прочитать.

Я попытался установить CharSet/CodePage/CharacterSet в расширенные свойства строки подключения, но без везения (на самом деле было исключено исключение: не удалось найти устанавливаемый ISAM).

Я также пытался прочитать его с помощью провайдера «vfpoledb», по-прежнему не повезло.

Например, есть строка «FRANTIŠEK», но переменная str содержит «FRANTIμEK».

Кто-нибудь знает, как это сделать? Thanks

+0

Вы можете сделать это с помощью «Полевого индекса» вместо имени поля, используя считыватель – MethodMan

+0

@DJKRAZE уверен, что я могу, но результаты остаются теми же – 2013-03-26 15:11:50

+0

Проверьте эту ссылку, что код означает, что что-то не настроено правильно http: // www.oocities.org/geoff_wass/dBASE/GaryWhite/dBASE/FAQ/qcp.htm | http://www.cs.cmu.edu/~varun/cs315p/xbase.txt | http://www.manmrk.net/tutorials/database/xbase/dbf.html – MethodMan

ответ

3

Ну, через несколько часов мне удалось получить строки правильно. Фокус в том, при чтении строки столбцы как VARBINARY (длина):

[TestMethod] 
public void TestMethod2() 
{ 
    const string path = @"D:\KN_Vzorka_2012\VL816183.DBF"; 

    var connection = new OleDbConnection(string.Format("Provider=vfpoledb;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;", Path.GetDirectoryName(path))); 
    connection.Open(); 

    var command = new OleDbCommand(string.Format("select cast(MNO as varbinary(20)) as MNO FROM {0}", Path.GetFileName(path)), connection); 

    using (var reader = command.ExecuteReader()) 
    { 
    while (reader.Read()) 
    { 
     var arr = (byte[])reader["MNO"]; 
     var str = Encoding.GetEncoding(852).GetString(arr); 

    } 
    } 

    connection.Close(); 
} 

Единственная проблема с длиной внутри VARBINARY CAST. Но это работает. Надеюсь, это тоже поможет кому-то.

+1

Я должен добавить, что в этом ответе использовался другой провайдер. CASTing не работает в «Microsoft.Jet.Oledb.4.0», но работает в провайдере Visual Fox Pro «vfpoledb». – Mirek

1

Вы можете указать идентификатор локали в строке соединения. Попробуйте изменить текст строки подключения следующим образом:

"Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;" 
+0

К сожалению, это тоже не сработает. – 2013-03-27 06:25:47