1

Microsoft.Jet.OleDb.4.0 を使用して csv ファイルを読み込んでいます。内部の情報を比較し、特定の基準を満たしている場合はドロップダウンに追加します。私の問題は、Microsoft.Jet.OleDb.4.0 が x86 とのみ互換性があることです。ただし、x64 として実行する必要がある他の機能があります。これを行うための更新または代替手段はありますか?

以下は私のコードです。私がx86にいる場合、これは現在機能します。

DataTable dataTable = new DataTable("table1");
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Directory.GetCurrentDirectory() + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""))
{
    conn.Open();
    string strQuery = "SELECT * FROM [" + "report.csv" + "]";
    OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
    adapter.Fill(dataTable);
    foreach (DataRow rows in dataTable.Rows) {
        if (rows[1].ToString() == "False")
        {
            unlicensed.Items.Add(rows[0].ToString());
        }
        if (rows[2].ToString() == "False")
        {
            litigation.Items.Add(rows[0].ToString());
        }
    }
}
4

5 に答える 5

0

最近この問題が発生しました。Microsoft.Jet.OleDb.4.0 ではなく、x86 を必要とする依存関係がありましたが、アプリの多くの部分を x64 で実行する必要がありました。私は2つのことをすることでそれを解決しました:

  1. その x86 依存関係を独自のプロジェクトに分離します。その 1 つのプロジェクトのターゲットを x86 に変更しました (そして、他のすべてのプロジェクト ターゲットを AnyCPU のままにしました - 私のアプリは 64 ビット サーバーにデプロイされています)。

  2. x86 依存関係を GAC に再登録しました。なぜそれが大きな違いを生んだのかはまだわかりませんが、そうすることでうまくいきました.

私の推測では、この問題にも同様のアプローチが必要になるでしょう。このリンクはかなり役に立ちました: https://lostechies.com/gabrielschenker/2009/10/21/force-net-application-to-run-in-32bit-process-on-64bit-os/


私が調査し、機能しましたが、最終的には使用しなかった根本的なアプローチは、出力をコンソールに書き込み、使用する独自の実行可能ファイルにx86コードをラップすることでしたが、それを行うことはお勧めProcess.Start()ProcessStartInfo.RedirectStandardOutputません. でも楽しい実験でした。

于 2016-02-03T21:14:19.633 に答える
0

別の質問に、役立つコードがいくつかあります。

C# での CSV ファイルの読み取り

私の答えのクラスを使用すると、新しいコードは次のようになります。

unlicensed.DataSource = CSV.FromFile("report.csv")
                     .Where(r => r[1] != "False").Select(r => r[0]);
litigation.DataSource = CSV.FromFile("report.csv")
                     .Where(r => r[2] != "False").Select(r => r[0]);

あなたの「偽」の基準は少し違うように思えますが、それは結果にかなり近いでしょう. リストで Append メソッドを使用することもできます。そして、他の質問を避けるために: はい、これはファイルを 2 回読み取ります。これが本当にパフォーマンスの問題になる場合は、一度だけ読み取るようにコードを書くことができますが、上記のようになります。おそらく、コードを短くすることによるメンテナンスのメリットは、パフォーマンスの問題よりも重要です。

于 2012-07-25T18:39:34.653 に答える
-1

32 ビット アプリケーションとしてコンパイルしてみてください (プラットフォーム ターゲット: ビルド オプションで x86)。

于 2012-07-25T18:34:51.300 に答える
-1

強く型付けされたくない場合は、List に頼ることができます

        public List<List<string>> ReadCsvTable(string path) {
            List<List<string>> table = new List<List<string>>();
            string[] lines = System.IO.File.ReadAllLines(path);
            foreach (string line in lines) {
                table.Add(new List<string>(line.Split(',')));
            }
            return table;
        }

以下のユーザーによって強調された問題に注意を払いたい場合は、引用されたフィールドを処理する必要があります。

        public List<List<string>> ReadCsvTable(string path) {
            List<List<string>> table = new List<List<string>>();
            string[] lines = System.IO.File.ReadAllLines(path);
            foreach (string line in lines) {
                List<string> rawFields = new List<string>(line.Split(','));                
                List<string> processedFields = new List<string>();
                foreach(string field in rawFields){
                    Match m = Regex.Match("^\"?(^<value>.*)\"?$", line);
                    processedFields.Add(m.Groups["value"].Value);
                }                
                table.Add(processedFields);
            }
            return table;
        }
于 2012-07-25T18:31:42.017 に答える