System.Data.dll中发生了'System.InvalidOperationException'类型的第一次机会异常

时间:2015-01-22 15:45:25

标签: c# winforms ms-access-97

我正在构建一个读取文本文件的C#应用​​程序,将读取的数据写入访问97 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()也不会改变连接状态。

2 个答案:

答案 0 :(得分:0)

尝试使用控制面板设置DSN&gt;管理工具&gt;设置数据源(ODBC)&gt;系统DSN&gt;添加。

将数据源名称作为MYDSN,然后单击“选择”并浏览到Access DB。

查看快照。

enter image description here

之后尝试代码如下:

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();
        }

    }
}

答案 1 :(得分:0)

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

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

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