Windows Form连接MS Access数据库无法保存记录求助
问题
我在Visual Studio中开发了一个连接MS Access数据库的Windows Form应用,该应用应允许用户在文本框中输入报告,并将该数据连同时间戳作为一条记录保存到数据库中。应用端一切看似正常,但数据并未保存或未在数据库中显示。我尝试过仅将数据库作为数据源、仅作为数据连接,以及同时使用两者,结果均相同。我刚接触相关开发,不太了解Windows Forms与数据库的交互。
相关代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; namespace CapstoneProjectDataEntryApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void SubmitBtn_Click(object sender, EventArgs e) { OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= C:\Users\Austin\Documents\School\CapstoneProjectDataEntryApp\ShabelReports.accdb"; try { conn.Open(); string myEntry = EntryTB.Text; string myDateTime = DateTime.Now.ToString(); string myQuery = "INSERT INTO ProgressReports (Report, DateTime) VALUES ('" + myEntry + "','" + myDateTime + "')"; OleDbCommand cmd = new OleDbCommand(myQuery, conn); cmd.ExecuteNonQueryAsync(); MessageBox.Show("Data saved successfully!"); } catch(Exception ex) { MessageBox.Show("Failed due to" + ex.Message); } finally { conn.Close(); EntryTB.Text = ""; } } } }
解决方案
异步方法未等待导致连接提前关闭:调用
ExecuteNonQueryAsync()但未使用await,代码会直接执行到finally块关闭连接,此时插入操作还未完成。需将按钮事件改为异步方法并等待执行:private async void SubmitBtn_Click(object sender, EventArgs e) { // 其他代码不变 await cmd.ExecuteNonQueryAsync(); // 其他代码不变 }SQL注入风险与语法错误:直接拼接字符串生成SQL,不仅存在安全隐患,用户输入含单引号的内容时会触发语法错误。改用参数化查询可解决这两个问题,同时保证数据类型正确解析:
string myQuery = "INSERT INTO ProgressReports (Report, DateTime) VALUES (@Report, @DateTime)"; OleDbCommand cmd = new OleDbCommand(myQuery, conn); cmd.Parameters.AddWithValue("@Report", EntryTB.Text); cmd.Parameters.AddWithValue("@DateTime", DateTime.Now); // 直接传入DateTime类型,无需ToString()日期时间格式问题:将
DateTime.Now转为字符串插入,可能因格式不匹配导致数据库无法识别,直接传入DateTime类型参数更可靠。资源自动释放:使用
using语句自动释放数据库连接和命令资源,避免手动关闭可能出现的遗漏:using (OleDbConnection conn = new OleDbConnection(connectionString)) { await conn.OpenAsync(); using (OleDbCommand cmd = new OleDbCommand(myQuery, conn)) { // 添加参数 await cmd.ExecuteNonQueryAsync(); } }
综合修改后的完整代码:
using System; using System.Windows.Forms; using System.Data.OleDb; using System.Threading.Tasks; namespace CapstoneProjectDataEntryApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private async void SubmitBtn_Click(object sender, EventArgs e) { string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= C:\Users\Austin\Documents\School\CapstoneProjectDataEntryApp\ShabelReports.accdb"; try { using (OleDbConnection conn = new OleDbConnection(connectionString)) { await conn.OpenAsync(); string myQuery = "INSERT INTO ProgressReports (Report, DateTime) VALUES (@Report, @DateTime)"; using (OleDbCommand cmd = new OleDbCommand(myQuery, conn)) { cmd.Parameters.AddWithValue("@Report", EntryTB.Text); cmd.Parameters.AddWithValue("@DateTime", DateTime.Now); await cmd.ExecuteNonQueryAsync(); } MessageBox.Show("Data saved successfully!"); EntryTB.Text = ""; } } catch (Exception ex) { MessageBox.Show($"Failed due to: {ex.Message}"); } } } }
内容的提问来源于stack exchange,提问作者austinreburks
相关产品推荐
相关产品推荐

