2

我正在构建一个读取文本文件的 C# 应用程序,将读取的数据写入访问 97 DB,然后读取 db 并写入文件。我的 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();

查看连接对象,我注意到两件事。

  • 服务器版本说:“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 回答