You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF中Microsoft Access数据库连接字符串问题求助

问题分析与解决步骤

核心错误:自定义了OleDbConnection类

你代码里手动实现的OleDbConnection完全是多余的,.NET框架已经提供了官方的System.Data.OleDb.OleDbConnection类用于连接Access数据库,自定义类会覆盖官方类,导致无法建立真实的数据库连接。


第一步:添加必要的引用与命名空间

  1. 右键项目 → 管理NuGet程序包,搜索System.Data.OleDb并安装(.NET Framework项目可能默认包含,.NET Core/.NET 5+需手动安装)。
  2. 在代码顶部添加以下命名空间:
using System.Data.OleDb;
using System.Windows; // 用于MessageBox
using System;
  1. 删除你自定义的internal class OleDbConnection代码块。

第二步:修正连接字符串与路径问题

你的连接字符串格式基本正确,但要注意数据库文件的路径有效性:

  • 如果数据库文件放在项目输出目录(如bin/Debug),可以通过程序目录拼接路径,避免找不到文件:
// 获取程序运行目录下的数据库路径
string dbPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database1.accdb");
string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};";
  • 确保电脑已安装Microsoft Access Database Engine 2010 Redistributable(对应版本),否则ACE驱动会无法识别。

第三步:实现真实的数据库登录验证

你当前的代码是硬编码判断账号密码,需要改成从Access数据库查询验证(假设数据库中有Users表,包含Username和Password字段):

  • 使用using语句自动释放数据库连接与命令对象,避免资源泄漏;
  • 用参数化查询防止SQL注入风险。

修正后的完整代码

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.Data.OleDb;
using System.Windows;
using System;

namespace Tetris
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 先验证输入不为空
            if (string.IsNullOrWhiteSpace(user.Text) || string.IsNullOrWhiteSpace(pass.Password))
            {
                MessageBox.Show("请输入账号和密码", "提示");
                return;
            }

            string dbPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database1.accdb");
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};";

            // 使用using语句自动释放数据库资源
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                try
                {
                    con.Open();
                    // 参数化查询,避免SQL注入
                    string sql = "SELECT COUNT(*) FROM Users WHERE Username = @Username AND Password = @Password";
                    using (OleDbCommand cmd = new OleDbCommand(sql, con))
                    {
                        cmd.Parameters.AddWithValue("@Username", user.Text);
                        cmd.Parameters.AddWithValue("@Password", pass.Password);

                        int userCount = (int)cmd.ExecuteScalar();
                        if (userCount > 0)
                        {
                            MessageBox.Show("登录成功", "验证通过");
                            // 此处可添加跳转至游戏主界面的逻辑
                        }
                        else
                        {
                            MessageBox.Show("账号或密码错误", "验证失败");
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"数据库连接异常:{ex.Message}", "错误");
                }
            }
        }

        private void Submit_Click(object sender, RoutedEventArgs e)
        {
            // 若为注册按钮,可在此实现用户注册逻辑(插入数据到Users表)
        }
    }
}

额外注意事项

  1. 确保Access数据库中存在Users表,且字段名与SQL语句中的Username、Password一致;
  2. 不要明文存储密码!实际项目中应对密码进行哈希加密(如SHA256、BCrypt),示例中为演示使用明文,生产环境必须修改;
  3. 若运行时提示“找不到Provider”,请下载安装对应版本的Microsoft Access Database Engine驱动。

内容的提问来源于stack exchange,提问作者S0ur._

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:16:05