Maciej
Lipski
Senior Software
Engineer
Temat: Problem z plikami dbf
Witam.Mam pewien problem z wyciaganiem i przetwarzaniem danych pochodzacych z plikow .dbf (dBase III plus). Sposob jakim wyciagam wszystkie dane z pliku:
OleDbConnectionStringBuilder lv_build = new OleDbConnectionStringBuilder();
lv_build.Provider = "Microsoft.Jet.OLEDB.4.0";
lv_build.DataSource = directory_name;
OleDbConnection lv_con = new OleDbConnection(lv_build.ToString() + ";Extended Properties=dBASE IV;");
String l_str_query = "SELECT * FROM " + file_name + ""; //file_name - nazwa pliku
OleDbDataAdapter lv_adap = new OleDbDataAdapter(l_str_query, lv_con);
DataSet lv_ds = new DataSet();
lv_adap.Fill(lv_ds);
I niby wszystko ok, dane sa wyciagniete. Tylko ze polskie znaki, ktore sa w nich sa w formie 'krzaczkow'. Musze z tej bazy wyciagac niektore dane, a niektore zmieniac. Ale niestety nie jestem w stanie wyszukiwac poprawnie, w przypadku gdy w klauzuli selekcji pojawiaja sie krzaczki. To znaczy gdy musze porownac "... WHERE col_1='ążńó'" w przypadku gdy col_1 zawiera krzaczaki, znaki nie sa sobie rowne.
Myslalem ze rozwiazalem problem, robiac cos takiego:
class libEncode
{
private const String lv_src = "windows-1250";
private const String lv_dst = "ibm852";
static public String Get(String str)
{
return Encoding.GetEncoding(lv_dst).GetString(Encoding.GetEncoding(lv_src).GetBytes(str));
}
}
Niby dla niektorych przypadkow dzialalo i moglem robic:
String lv_query = "... WHERE col_1='"+ libEncode.Get("ń") +"'";
No ale jak sie okazalo, jednak tylko dla niektorych polskich znakow trafilem w to kodowanie. Problem pozostal, tylko ze nie moge znalezc kodowania, ktore 'trafi' w te, ktore jest wykorzystane w pliku. Nawet po napisaniu:
String l_str_check = "ąćńół"; //string do sprawdzenia wyciagniety z .dbf, przypisanie ma charakter symboliczny zebyscie wiedzieli co tam jest
foreach (EncodingInfo ei1 in Encoding.GetEncodings())
{
foreach (EncodingInfo ei2 in Encoding.GetEncodings())
{
String l_str_compare = "ąćńół";
l_str_compare = Encoding.GetEncoding(el1.CodePage).GetString(Encoding.GetEncoding(el2.CodePage).GetBytes(l_str_compare));
if(l_str_check.Equals(l_str_compare)) MessageBox.Show("El1: "+ el1.CodePage +" El2: "+ el2.CodePage);
}
}
Wybralem sobie kilka przykladowych kolumn z polskimi znakami, tak zeby sprawdzic jak najwiecej. Napisalem ich odpowiedniki (tak jak w powyzszym przykladzie l_str_compare). No i klops - nie moge znalezc tego kodowania.
Moze to jakos naprowadzi kogos z Was: Sciagnalem tez 3 programy do podgladania plikow .DBF (np DBF Viewer czy DBF Lister (do totalcmd)) i wszystkie poprawnie wyswietlaja polskie znaki. Istnieje tam opcja nazywana "DOS/ANSI" lub "Use OEM characters", ktora zamienia widok z krzaczkow, ktore ja widze, na polskie znaki:
Use OEM characters
Hot key: F12
If set ON use OEM characters
Ma ktos jakies podpowiedzi jak mozna rozwiazac problem, tak, bym mogl swobodnie korzystac z polskich znakow w tym .dbf? Dodam ze nie moge konwertowac tego .dbf na inna strone kodowa - plik .dbf i jego strona kodowa musza zostac nieruszone (sa wykorzystywane przez inny, istniejacy juz program ktorego nie moge modyfikowac).