System.Data.dll 中出现“System.InvalidOperationException”类型的第一次机会异常

Posted

技术标签:

【中文标题】System.Data.dll 中出现“System.InvalidOperationException”类型的第一次机会异常【英文标题】:A first chance exception of type 'System.InvalidOperationException' occurred in System.Data.dll 【发布时间】:2015-03-21 11:45:25 【问题描述】:

我正在构建一个读取文本文件的 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();

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

Server Version 说:'cnn.ServerVersion' 抛出了 'System.InvalidOperationException' 类型的异常

另外,cnn.Open() 和 cnn.OpenAsync() 都不会改变连接的状态。

【问题讨论】:

哪一行抛出异常? command.ExecuteNonQuery(); 看起来像 cnn.Open();没有打开导致抛出异常的连接。 不,它似乎没有打开连接。 您是指定数据库的完整路径还是仅指定文件名? 【参考方案1】:

所以经过更多调查后,我确定我的连接字符串中的 oledb 驱动程序仅支持 32 位应用程序。我使用的是 64 位机器,因此应用程序属性会自动使其成为 64 位应用程序。

我执行了以下步骤来解决问题:

    在解决方案资源管理器中右键单击项目 选择属性 选择构建选项卡 将平台目标从“任何 CPU”更改为“x86”(32 位) 重新构建应用程序,它应该可以工作。

【讨论】:

【参考方案2】:

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

    

【讨论】:

答案中的图片? 我添加了一张新图片。检查一下。 图像仍然损坏。 它对我来说没有坏处,兄弟。无论如何,这里已经托管了图像s10.postimg.org/umihd50rd/odbc.png。请看一看。

以上是关于System.Data.dll 中出现“System.InvalidOperationException”类型的第一次机会异常的主要内容,如果未能解决你的问题,请参考以下文章

SQL 异常未处理 - System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

System.Data.dll 中出现“System.InvalidOperationException”类型的第一次机会异常

System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常附加信息:无法识别的数据库格式

错误提示:未处理的“System.NullReferenceException”类型的异常出现在 system.data.dll 中。 其他信息: 未将对象引用设置到对象的实例。

vb 上的 System.Data.dll 中发生错误 System.InvalidOperationException' [重复]

C# - INSERT INTO 语句中的语法错误(System.Data.dll 中发生“System.Data.OleDb.OleDbException”类型的未处理异常)