如何通过.NET链接外部Access表?

时间:2013-05-15 19:32:00

标签: .net database ms-access

我的解决方案中的App_Data文件夹中有两个文件。这两个文件都是.accdb个文件,一个是表格的核心文件。我有另一个文件,其中包含我不再需要的存储查询和一些VBA元素,但我需要存储的查询。此解决方案位于网络驱动器上,并且保存查询的文件和保存表的文件已链接。

当我创建安装项目并安装应用程序时,我只需要包含查询的文件。问题是此文件链接回表文件的原始位置。我需要它来请求包含表的文件的位置,因为它将安装在另一台机器上,其中包含该表的.accdb文件可以在任何地方。有没有办法让OpenFileDialog让他们指出它的位置?

我目前有一个包含DAL的N层应用程序,它获取存储在My.Settings中的连接字符串。字符串是"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\App_Data\FPC_Reporting.accdb",它是包含存储查询的安装中包含的文件。但是,该文件仍然认为包含表的文件仍然指向我的网络位置,但如上所述,它可能在任何地方,所以我想让它询问用户;在安装之后,找到包含表的本地文件的位置。

安装应用程序后以及断开网络驱动器后收到的错误“N:\ PROJECTS \ FPC Reporting Tool \ FPCReportBuilder \ FPCReportBuilder \ App_Data \ FPC_Reporting_DATA.accdb'不是有效路径。确保路径名拼写正确,并且您已连接到文件所在的服务器。“错误中显示的文件名是包含应该链接到包含的文件的表的文件存储的查询显示在连接字符串中。

2 个答案:

答案 0 :(得分:1)

以下C#代码已经过测试并确认在Visual Studio 2010中正常工作:

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string RemoteDatabasePath = openFileDialog1.FileName;

        // the following code requires that the project have a COM reference to:
        // "Microsoft Office 14.0 Access Database Engine Object Library"

        // create the DBEngine object
        var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine();

        // open the local database file containing the linked table
        Microsoft.Office.Interop.Access.Dao.Database db = dbe.OpenDatabase(@"C:\__tmp\testData.accdb");

        // create a TableDef object for the linked table we want to update
        Microsoft.Office.Interop.Access.Dao.TableDef tbd = db.TableDefs["Products"];

        // update the .Connect property with the full path to the remote database
        tbd.Connect = ";DATABASE=" + RemoteDatabasePath;

        // refresh the table link
        tbd.RefreshLink();

        // test the new connection
        Microsoft.Office.Interop.Access.Dao.Recordset rs = db.OpenRecordset("SELECT * FROM Products", Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenSnapshot);
        MessageBox.Show(rs.Fields["ProductName"].Value);
        rs.Close();
    }
    this.Close();
}

编辑重新评论

检查给定计算机上安装的Access数据库引擎(“ACE”)的版本:

搜索文件ACEOLEDB.DLL

  1. 如果在C:\Program Files\Common Files\Microsoft Shared\OFFICE14中找到它,则安装ACE并且其版本与操作系统的“bit-ness”匹配:32位Windows上的32位ACE和64位ACE on 64位Windows。

  2. 如果在C:\Program Files (x86)\Common Files\microsoft shared\OFFICE14中找到,则在64位Windows上安装32位ACE。

  3. 使用ACE的任何应用程序都需要安装正确的版本:32位应用程序将需要32位版本的ACE(即使在64位Windows上),而64位应用程序将需要64位版本ACE。针对“任何平台”的.NET应用程序将需要与主机操作系统的“bit-ness”匹配的ACE版本。

答案 1 :(得分:0)

您可以尝试一种方法将Access DB与解决方案分离。将其从App_Data文件夹中删除。

在系统上为DSN Data Source (ODBC)创建Microsoft Access Driver,并通过网络指向Access DB文件。更好的是,如果您可以将系统上的网络驱动器映射到系统运行时自动映射/用户已登录。

在您的代码中,使用connection-string以及上面创建的DSN

检查this


修改 如果您想要的只是OpenFileDialog,那么您可以试试这个:

private void Button1_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
    openFileDialog1.InitialDirectory = "C:\\"; 

    openFileDialog1.Title = "Select Database"; 
    openFileDialog1.CheckFileExists = true; 
    openFileDialog1.CheckPathExists = true; 
    openFileDialog1.DefaultExt = "accdb"; 
    openFileDialog1.Filter = "Access DB files (*.accdb;*.mdb)|*.accdb;*.mdb"; 
    openFileDialog1.FilterIndex = 2; 
    openFileDialog1.RestoreDirectory = true; 
    openFileDialog1.ReadOnlyChecked = true; 
    openFileDialog1.ShowReadOnly = true; 
    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
        // This will give you the selected file
        string file = openFileDialog1.FileName;
        string connectionString = "Some connection stuff; DATABASE=" + file;
        // Connect to the Access DB
    } 
}
  

请使用此代码作为起点而不是复制粘贴解决方案。