连接MS access数据库

本文关键字:数据库 access MS 连接 | 更新日期: 2023-09-27 18:14:01

我最近开始学习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;";

这个路径是从文件的properties/security选项卡中复制的,所以应该是正确的。我也尝试过

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,唯一的区别是,后2个选项返回以下异常,只要我运行应用程序之前,甚至手动触发试图连接到我的数据库的事件。

System.IO类型的异常。目录notfoundexception '在mscorlib.dll中发生,但未在用户代码中处理

附加信息:找不到路径"D:'Google Drive' programming ' 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)
        {
        }
    }
}

我还尝试用这些代码片段以编程方式获取文件名

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,所有驱动程序都更新了。

我已经尝试了我能想象的一切,现在搜索了几个小时的网络,这是我最后的手段,如果你能帮助甚至只是发送一个链接到一个可能有帮助的网页,我会很感激。我的英语不是我的第一语言,提前感谢并为我的英语感到抱歉。

编辑我没有MS Access打开,而试图与它连接,因为我知道它使用某种保护,而打开?

连接MS access数据库

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

问题是,当Google Drive同步我的文件时,它有时会"他妈的一点",并将文件夹重命名为"传感器(1)",而不是原来的名称"传感器",这导致了这样的结论:在我获得文件路径和试图运行应用程序之间的某个时间,Google Drive改变了文件夹的名称,因此路径确实无效。感谢所有试图帮助我的人,尤其是编辑我的问题的人,因为我是新来的,甚至还在学习如何格式化我的问题。