连接到 MS Access 数据库

Posted

技术标签:

【中文标题】连接到 MS Access 数据库【英文标题】:Connecting to MS access database 【发布时间】:2015-09-21 20:06:57 【问题描述】:

我最近开始学习 C# WPF(使用 MS VS 2013 express)并且我尝试连接到我的访问数据库但没有任何成功,我遇到的问题是每当我尝试建立连接时都会收到此异常 “不是一个有效的文件名”

我比我应该意识到的晚(并且在对此事进行了大量的谷歌搜索之后)它一定与我下面的连接字符串有关:

connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=‪D:\\Google Drive\\Programmering\\C#\\WpfApplication3\\WpfApplication3\\bin\\Debug\\sensors\\MPU6050.accdb; 
Persist Security Info=False;";

并且此路径是从文件的属性/安全选项卡复制的,因此应该是正确的。 我也试过

connect.ConnectionString ="Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=‪D:\Google Drive\Programmering\C#\WpfApplication3\WpfApplication3\bin\Debug\sensors\MPU6050.accdb; 
Persist Security Info=False;";

相同,但不包括开头的 @

我已尝试将其调试为任何 CPU、x64 和 x86,唯一的区别是后两个选项在我运行应用程序时立即返回以下异常,甚至在手动触发尝试连接到我的数据库的事件之前.

在 mscorlib.dll 中出现“System.IO.DirectoryNotFoundException”类型的异常,但未在用户代码中处理

附加信息:找不到路径“D:\Google Drive\Programmering\C#\WpfApplication3\WpfApplication3\bin\x64\Debug\sensors”的一部分。

我认为这个异常变量与我将其调试为 Any CPU 时几乎相同。

这是我的 C# 代码 MainWindow.xaml.cs 和我的 XAML 代码不相关,因为我的代码中包含与数据库有关的所有内容。 (据我所知) 这对您来说可能看起来像是个笑话,但正如我之前所说,我刚刚开始使用 WPF(和 C#),我自己已经知道我可以在某些方面更有效地处理事情。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO.Ports;
using System.IO;
using System.Data.OleDb;
using System.Data;
using System.Windows.Threading;

namespace WpfApplication3

    public partial class MainWindow
    
        public MainWindow()
        
            InitializeComponent();
            avbComPort.Text = "COM Port";
            addSensors();            
           
            foreach (string s in SerialPort.GetPortNames()) 
            
                ComboBoxItem cbi = new ComboBoxItem();
                cbi.Content = s;
                avbComPort.Items.Add(cbi);
            
        

        public void addSensors()
        
            string dynamicPath = System.IO.Directory.GetCurrentDirectory();
            string fullPath = dynamicPath + "\\sensors";
            string[] sensors = Directory.GetFiles(fullPath);
            int fileQuantity = sensors.Length -1;

            for (int i = 0; i <= fileQuantity ; i++)
            
                string path = sensors[i];
                string[] pathArr = path.Split('\\');
                string[] fileArr = pathArr.Last().Split('.');
                string fileName = fileArr.First().ToString();
                MenuItem sensor = new MenuItem Header = fileName;
                sensor.Click += new RoutedEventHandler(sensor_Click);
                confSensors.Items.Add(sensor);

            
        

        public void sensor_Click(Object sender, RoutedEventArgs e)
        
            MenuItem sensor = sender as MenuItem;
            TabItem tab = new TabItem  Header = sensor.Header, Width = sensorTab.Width, Height = sensorTab.Height ;
            DataGrid dataLog = new DataGrid()  Name = "dataLog", IsReadOnly = true, Width = 300, Height = 500, HorizontalAlignment = 0, VerticalAlignment = 0, AutoGenerateColumns = true, ItemsSource = "Binding";

            string filePath = System.IO.Directory.GetCurrentDirectory() + "\\sensors" + sensor.Header + ".accdb";
            
            try //code regarding the database connection
            
                OleDbConnection connect = new OleDbConnection();
                connect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=‪D:\\Google Drive\\Programmering\\C#\\WpfApplication3\\WpfApplication3\\bin\\Debug\\sensors\\MPU6050.accdb; Persist Security Info=False;";
                connect.Open();
                dbStatusLbl.Content = "Connection to database established successfully";
                connect.Close();
            
            catch(Exception ex)
            
                MessageBox.Show("A problem occured while trying to establish a stable connection to the database:  " + ex.Message, "A wild error has appeared", MessageBoxButton.OK, MessageBoxImage.Error);
             // end of that code
            Grid grid = new Grid()  Height = tab.Height, Width = tab.Width;
            grid.Children.Add(dataLog);
            tab.Content = grid;
            sensorTab.Items.Add(tab);
        

        private void sensorTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
        
        
    

我也尝试使用这些 sn-ps 以编程方式获取文件名

string filePath = System.IO.Directory.GetCurrentDirectory() + "\\sensors" + sensor.Header + ".accdb";

connect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|filePath|‪; Persist Security Info=False;";

\\sensors 是我的 bin\debug 文件夹中的文件夹,sensor.Header 来自 public void addSensors() 方法,并且在我将信息存储在 .txt 文件而不是 MS access db 的先前上下文中,它已明确工作,如您所见,这将导致与完整路径相同的字符串,并且正如预期的那样,它返回完全相同的异常。

此外,我还有 Office 2013 64 位、Windows 10 和 Visual Studio 2013 express for desktop,所有驱动程序都已更新。

我已经尝试了我能想象到的一切,并在网上搜索了几个小时,这是我最后的手段,如果你能提供帮助,即使只是发送一个可能有帮助的网页的链接,我将不胜感激。 在此先感谢并为我的英语感到抱歉,因为它不是我的母语。

编辑我在尝试连接时没有打开 MS Access,因为我知道它在打开时使用了某种保护?

【问题讨论】:

从第一个连接字符串中删除 @ 或将其添加到第二个 不幸的是,我已经尝试了所有这些组合,@ 带 //,@ 带 /,// 不带 @,/ 不带 @ 然后尝试使用 File.Exists(....fullfilename...) 检查您的程序中是否可以访问该文件 好的,我明天试试,感谢您的快速回复:) 您的第一个示例连接字符串不应使用 @ 符号。您的连接字符串的第二个示例应该使用 @ 符号。此外,您应该检查您的代码是否可以访问访问数据库。换句话说,按照史蒂夫的建议去做。他正在为你指引正确的方向。 【参考方案1】:

我已经解决了! 而且我有点尴尬,因为我以前经历过这种情况,但这次我从来没有想过,因为我从来没有换过电脑。

问题在于,当 Google 云端硬盘同步我的文件时,它有时会“f*ck a bit”并将文件夹重命名为“sensors(1)”,而不是原来的名称“sensors”,这导致了我之间的某个时间得到的结论文件路径并尝试运行应用程序谷歌驱动器更改了文件夹的名称因此路径确实无效,感谢所有试图帮助的人,尤其是编辑我的问题的 2,因为我在这里很新,还在学习甚至如何格式化我的问题。

【讨论】:

以上是关于连接到 MS Access 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何连接到数据库 MS Access?

除了 ms-access 之外,我可以使用哪些其他程序连接到 odbc 数据库

使用 MS Access 2003 连接到 SQL Server 2005

无法连接到远程 MS Access 数据库

如何让 ms-access 以其他用户身份连接到 ms-sql?

手动将 MS Access 数据库连接到 Visual Studio