2012-05-08 7 views
0

私はDBFファイルに接続された交流#プログラムを、持っている:(文字列データ

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データの場合のみです。どうすれば問題を解決できますか?私は答えを読んだアントニオ・バクラのヘルプによると、任意のヘルプ


ため

ありがとう:

私は、OLEにODBCから変更し、必要があります。 - へのConnectionString変更: oconn。 ConnectionString = "Provider = vfpoledb.1;データソース=" + pelna_sciezka + ";照合順序= machine"; 変更コード:

OleDbDataReader odr = ocmd.ExecuteReader(); OdczytajTabliceBajtow

  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(オブジェクトp) {エンコーディングenc8 = Encoding.ASCII。 文字列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/en-us/library/system.data.odbc.odbcdatareader.getstring .aspx。ネイティブ形式を取得する代わりに。 – Jodrell

+0

この列には、varchar型(dbf構造のC(100))があります。他の型は非常にうまく変換されていますが、 'C'型のみで問題が発生します – BKl

+0

ドキュメントには、「指定された列の値をネイティブ形式で取得します」というドキュメントが記載されているので、列はあなたの希望のタイプと互換性があります。インデックスアクセサは、VFPテキストデータをバイト配列として返しますが、完全に不合理ではありません。テキストのエンコーディングを知っているなら、 'System.Text'名前空間を使って.Net文字列に変換することができます。もしそうでなければ、 'GetString'を呼び出してODBC層に変換をさせることができます。 – Jodrell

答えて

2

は、私はあなたがFoxProのOLEDBドライバを使用して、これらの問題を持っていないだろう、と速度が顕著ゲインがあることをreccomend、ここにリンク

http://www.microsoft.com/en-us/download/details.aspx?id=14839

され、その後、あなたはから値を取得します文字フィールドの文字列としてのDataReader

関連する問題