winforms System.Data.dll中发生了类型为“System.InvalidOperationException”的第一次机会异常

qni6mghb  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(288)

我正在构建一个C#应用程序,它读取一个文本文件,将读取的数据写入Access 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()两者都不改变连接的状态。
piok6c0g

piok6c0g1#

因此,在做了更多的调查之后,我确定我的连接字符串中的OLEDB驱动程序只支持32位应用程序。我使用的是64位计算机,因此应用程序属性自动使其成为64位应用程序。
我执行了以下步骤来解决此问题:
1.在解决方案资源管理器中右键单击项目
1.选择属性
1.选择“生成”选项卡
1.将平台目标从“任何CPU”更改为“x86”(32位)
1.重新构建应用程序,它应该可以工作。

xuo3flqw

xuo3flqw2#

尝试使用“控制面板”〉“管理工具”〉“设置数据源(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();
        }

    }
}

相关问题