2

テキストファイルを読み取り、読み取ったデータをアクセス97 DBに書き込み、次にdbを読み取ってファイルに書き込むC#アプリケーションを構築しています。OLEDB 接続文字列に問題があるようです。以下は私のコードです。この例外が発生する理由は誰にもわかりますか?

データベースは存在し、クエリを実行する前にのみ接続を開き、再度閉じます。

               string fileName = "JobLogReport.mdb";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + fileName + ";";
            OleDbConnection cnn = new OleDbConnection(connectionString);

            string[] fileNames = openFileDialog1.FileNames;
            int lineSkips = 2;
            int fileCount = 1;

            for (int i = 0; i < fileNames.Length; i++) 
            {
                if (i == 0) { tbProgress.Text += "Reading Job Log File Number:" + fileCount + "\r\n"; }
                if (i == 1) { tbProgress.Text += "Reading Job Log File Number:" + (fileCount + 1) + "\r\n"; }

                tbProgress.Text += "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \r\n";
                tbProgress.Text += "Populating Database \r\n";
                tbProgress.Text += "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \r\n";
                fileReader = new StreamReader(fileNames[i].ToString());
                while (!fileReader.EndOfStream)
                {
                    String file = fileReader.ReadLine();
                    if (file.StartsWith("IC.PXPSG"))
                    {
                        OleDbCommand command = new OleDbCommand();
                        char[] delimiters = new char[] { ' ' };
                        string[] line = file.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

                        command.CommandText = "INSERT INTO DocsReceived (Filename, Documents) VALUES (?,?)";
                        command.Parameters.AddWithValue("@filename", line[0]);
                        command.Parameters.AddWithValue("@documents", Int32.Parse(line[1], NumberStyles.Any, CultureInfo.InvariantCulture));
                        command.Connection = cnn;
                        cnn.Open();
                        command.ExecuteNonQuery();
                        cnn.Close();

接続オブジェクトを見ると、2 つのことがわかります。

  • サーバーのバージョンは次のように述べています:「cnn.ServerVersion」がタイプ「System.InvalidOperationException」の例外をスローしました

  • また、 cnn.Open() と cnn.OpenAsync() はどちらも接続の状態を変更しません。

4

2 に答える 2

0

そのため、さらに調査を行った結果、接続文字列の oledb ドライバーが 32 ビット アプリケーションのみをサポートしていると判断しました。私は 64 ビット マシンを使用しているため、アプリケーション プロパティによって自動的に 64 ビット アプリケーションになります。

この問題を解決するために、次の手順を実行しました。

  1. ソリューション エクスプローラーでプロジェクトを右クリックします。
  2. プロパティを選択
  3. ビルドタブを選択
  4. プラットフォーム ターゲットを「任意の CPU」から「x86」(32 ビット)に変更します。
  5. アプリケーションを再構築すると、動作するはずです。
于 2015-01-22T18:38:21.640 に答える
0

[コントロール パネル] > [管理ツール] > [データ ソースの設定 (ODBC)] > [システム DSN] > [追加] を使用して、DSN の設定を試みます。

データ ソース名を MYDSN として指定し、[選択] をクリックして Access DB を参照します。

スナップショットを参照してください。

ここに画像の説明を入力

その後、次のコードを試してください。

string strDSN = "DSN=MYDSN";
string cmdText = "Insert into AccessTable (ColumnA,ColumnB) Values (?,?)";
using (OdbcConnection cn = new OdbcConnection(strDSN))
{
    using (OdbcCommand cmd = new OdbcCommand(cmdText, cn))
    {
        cn.Open();
        foreach (DataRow r in dt.Rows)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@p1", r["ColumnA"].ToString());
            cmd.Parameters.AddWithValue("@p2", r["ColumnB"].ToString());
            cmd.ExecuteNonQuery();
        }

    }
}
于 2015-01-22T16:39:57.413 に答える