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”类型的未处理异常)