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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:05:21