C# WPF中Microsoft Access数据库连接字符串问题求助
问题分析与解决步骤
核心错误:自定义了OleDbConnection类
你代码里手动实现的OleDbConnection完全是多余的,.NET框架已经提供了官方的System.Data.OleDb.OleDbConnection类用于连接Access数据库,自定义类会覆盖官方类,导致无法建立真实的数据库连接。
第一步:添加必要的引用与命名空间
- 右键项目 → 管理NuGet程序包,搜索
System.Data.OleDb并安装(.NET Framework项目可能默认包含,.NET Core/.NET 5+需手动安装)。 - 在代码顶部添加以下命名空间:
using System.Data.OleDb; using System.Windows; // 用于MessageBox using System;
- 删除你自定义的
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表) } } }
额外注意事项
- 确保Access数据库中存在
Users表,且字段名与SQL语句中的Username、Password一致; - 不要明文存储密码!实际项目中应对密码进行哈希加密(如SHA256、BCrypt),示例中为演示使用明文,生产环境必须修改;
- 若运行时提示“找不到Provider”,请下载安装对应版本的Microsoft Access Database Engine驱动。
内容的提问来源于stack exchange,提问作者S0ur._
相关产品推荐
相关产品推荐

