2012-05-08 28 views
0

我有一個C#程序,連接到DBF文件:字符串數據到C#程序

OdbcConnection oconn = new OdbcConnection(); 
oconn.ConnectionString = 
    "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + pelna_sciezka + ";Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"; 
oconn.Open(); 
OdbcCommand ocmd = oconn.CreateCommand(); 

ocmd.CommandText = @"SELECT * FROM " + pelna_sciezka + " where Kod_kontr = '" + row.KNH_KOD + "'"; 
// ocmd.ExecuteNonQuery(); 
OdbcDataReader odr = ocmd.ExecuteReader(); 
while (odr.Read()) 
{ 
    kod_kontr = odr["Kod_kontr"].ToString(); 
    Nzwakontr1 = odr["Nzwakontr1"]; 
    Nzwakontr2 = odr["Nzwakontr2"]; 
} 

連接工作得很好,但是當我想組裝數據,以本地字符串變量( kod_kontr,nzwakontr1),所有我得到的值是System.Byte[]。當我想從這個dbf中獲得其他類型的數據(f.ex. date,numeric等)時,一切正常。該問題僅適用於varchar數據。我怎麼能解決我的問題?

感謝名單的任何幫助


據安東尼巴庫拉的幫助,我讀過了答案:

我必須從ODBC變爲OLE和: - 變化的ConnectionString到: oconn。 ConnectionString =「Provider = vfpoledb.1; Data Source =」+ pelna_sciezka +「;整理順序=機器」; 更改代碼爲:

OleDbDataReader odr = ocmd.ExecuteReader();

  while (odr.Read()) 
      { 
       // byte[] A = Encoding.GetEncoding(Encoding.Default.CodePage).GetBytes(odr.GetString(0)); 
       // string p = Encoding.Unicode.GetString((Encoding.Convert(Encoding.GetEncoding(850), Encoding.Unicode, A))); 

       kod_kontr = OdczytajTabliceBajtow(odr["Kod_kontr"]); 
       Nzwakontr1 = OdczytajTabliceBajtow(odr["Nzwakontr1"]); 
       Nzwakontr2 = OdczytajTabliceBajtow(odr["Nzwakontr2"]); 
      } 

其中OdczytajTabliceBajtow:

私人字符串OdczytajTabliceBajtow(對象P) { 編碼enc8 = Encoding.ASCII; string wynik =「」; Byte [] bytes =(Byte [])p; StringBuilder sb = new StringBuilder(); sb.Append(Encoding.ASCII.GetChars(bytes)); wynik = sb.ToString(); return wynik; }

這是我的問題的解決方案。謝謝大家的幫助。

+0

這些列的數據類型是什麼,可能應該調用'GetString' http://msdn.microsoft.com/zh-cn/library/system.data.odbc.odbcdatareader.getstring .aspx而不是檢索本機格式。 – Jodrell

+0

這個列有一個varchar類型(C(100)在dbf結構中)。其他類型轉換得非常好,只有'C'類型出現問題 – BKl

+0

正如文檔所述,索引accesor「以其本機格式獲取指定列的值」,它恰好發生了某些這些列與您所需的類型兼容。看起來索引訪問器將VFP文本數據作爲字節數組返回,並非完全不合理。如果您知道文本的編碼,則可以使用'System.Text'命名空間將其轉換爲.Net字符串。如果你不這樣做,你可以調用'GetString'並讓ODBC層爲你做轉換。 – Jodrell

回答