1

嗨,我是 C# 新手,正在尝试连接到 .accdb 访问 2010 数据库

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            OleDbConnection connect = new OleDbConnection();
            connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Web Develop\Documents\Storekeeper\storekeeper.accdb;Persist Security Info=False;";
            connect.Open();
            MessageBox.Show("Connection open");
        }
    }
}

我得到了这个例外:

System.Data.OleDb.OleDbExceptionSystem.Data.dll 中发生了第一次机会异常类型

数据库未使用且路径正确,我该怎么办?

4

4 回答 4

4

抛出的异常应该有一个InnerException可以检查的属性。它会告诉你确切的错误是什么。要查看它,您需要捕获异常,然后显示 InnerException 消息:

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        OleDbConnection connect = new OleDbConnection();
        connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Web Develop\Documents\Storekeeper\storekeeper.accdb;Persist Security Info=False;";
        connect.Open();
        MessageBox.Show("Connection open");
    }
    catch (OleDbException e)
    {
        Messagebox.Show(e.InnerException.Message);
    }
}

在OleDbExceptionOleDbException的 MSDN 页面中,还有用于捕获和显示嵌入的错误的附加示例代码。

于 2013-05-03T17:22:43.947 回答
1

好的。如果您在 64 位 O/S 上安装了 Office 32 位,那么您将会遇到麻烦。尝试将“平台输出”更改为 x86。转到您的项目属性并找到“构建”选项卡。“平台目标”应在此处列出。

现在,即使这样可行,您也必须调查该决定的后果。但至少“你会知道”。

编辑 - - - - - - -

这是你的排列。你只需要对它们进行试验。

  1. 连接字符串,是对还是错。如前所述,“12”与“14”。(对不起,链接是关于 Excel 的。尝试使用“TS”的建议。)

  2. 正在安装 Office 32 位。我认为如果您尝试在该机器上安装“AccessDatabaseEngine_x64.exe”,它会给您一个“Office 版本不正确”的错误。

  3. 所以因为#2,你必须安装“AccessDatabaseEngine.exe”。这是32位。

  4. “平台输出”。现在我~~想~~因为#3,你需要尝试将它设置为x86。

尝试将其放回 x86,然后尝试连接字符串中的“12”与“14”。

编辑 - - - - - - - - -

我从网上下载了一个文件。

Oren.accdb 来自 http://old.cba.ua.edu/~jomason/ac289/289AccessFiles.html

我在我的机器上编码了这个。它有效。

  private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            using (OleDbConnection connect = new OleDbConnection())
            {
                connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\folder1\data\Oren.accdb;Persist Security Info=False;";
                connect.Open();

                OleDbCommand cmd = new OleDbCommand();
                cmd.Connection = connect;
                cmd.CommandText = "Select * from Agreement";

                StringBuilder sb = new StringBuilder();
                IDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Console.WriteLine(reader[0].ToString());
                    sb.Append(string.Format("{0}, {1}", reader[0].ToString(), reader[1].ToString()) + System.Environment.NewLine);
                }
                reader.Close();

                ReportMessage(sb.ToString());

            }
        }
        catch (System.Data.OleDb.OleDbException lolex)
        {
            ReportException(lolex);
        }
        catch (Exception ex)
        {
            ReportException(ex);
        }

    }




  private void ReportException(Exception ex)
    {
        txtStatus.Text = ex.Message;
    }


    private void ReportException(System.Data.OleDb.OleDbException oleex)
    {

        StringBuilder sb = new StringBuilder();
        sb.Append(oleex.ErrorCode + System.Environment.NewLine);
        sb.Append(oleex.Message + System.Environment.NewLine );
        txtStatus.Text = sb.ToString();
    }

    private void ReportMessage(string msg)
    {
        txtStatus.Text = msg;
    }

编辑

你能在“Microsoft Access”程序中打开文件“storekeeper.accdb”吗?它没有密码保护是吗?

于 2013-05-03T18:07:31.937 回答
1

我想,这很简单。既然你上了office 2010,相信你需要:Microsoft.ACE.OLEDB。14 .0

于 2013-05-03T17:35:24.990 回答
0

您需要在连接字符串的数据源路径上放置双斜杠,例如 'Data Source=C:\folder1\data\Oren.accdb;Persist Security Info=False;";'

于 2016-10-20T21:09:00.117 回答