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

C#中Table Adapter数据已保存但数据库未更新问题求助

C#本地服务数据库插入数据丢失问题解决

问题场景

  • 已创建本地基于服务的数据库、对应users表的DataSet、Table Adapter,以及Table Adapter内可正常运行的SQL Insert查询
  • 执行以下代码后,能临时登录插入的用户,但物理数据库无数据,重启应用后无法登录:
adapter.Insert("values");
adapter.Update(DataSet);
  • 调整数据库复制属性时遇报错:设为“Don't copy”时提示An attempt to attach an auto-named database.,当前使用“Copy if newer”属性
  • 已通过工具箱添加Binding Source、DataSet、Table Adapter并正确配置数据源,无需内联SQL

核心原因

调试运行时,Visual Studio会自动将项目根目录的数据库文件复制到输出目录(如bin\Debug),代码实际操作的是输出目录中的数据库副本,而非项目根目录的原文件。关闭应用后,若复制属性为“Copy if newer”,下次调试时原文件未更新则不会覆盖副本,但如果误查看原文件,就会出现数据“丢失”的假象;若副本被重置,重启应用后也无法读取临时插入的数据。

解决步骤

1. 规范数据插入流程

直接调用adapter.Insert()后执行Update()的逻辑有误,需先操作DataSet对应的DataTable,再提交更改:

// 向DataSet的Users表添加新行(替换为你的实际DataTable名称)
DataRow newUserRow = dataSet.Users.NewRow();
newUserRow["UserName"] = "values"; // 替换为实际列名和对应值
dataSet.Users.Rows.Add(newUserRow);

// 提交更改到数据库
adapter.Update(dataSet.Users);

2. 调整数据库复制属性与连接字符串

方案一:操作项目根目录的数据库

  • 在解决方案资源管理器中右键数据库文件 → 属性,将“复制到输出目录”设为**“不复制”**
  • 修改App.config中的连接字符串,确保AttachDbFilename指向项目根目录的数据库文件。示例:
    <connectionStrings>
        <add name="YourConnStringName" 
             connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\YourProjectPath\YourDatabase.mdf;Integrated Security=True" 
             providerName="System.Data.SqlClient" />
    </connectionStrings>
    
    (替换为你的实际数据库路径和连接字符串名称)

方案二:保留“Copy if newer”并查看正确的数据库

  • 调试时,数据实际写入的是输出目录(如bin\Debug)下的数据库副本,打开该目录下的.mdf文件即可查看真实数据
  • 若需要永久保存调试数据,可手动将输出目录的数据库副本复制回项目根目录

3. 解决“Don't copy”时的报错

出现An attempt to attach an auto-named database错误,是因为连接字符串中AttachDbFilename路径不正确,需确保路径指向存在的数据库文件,文件名无特殊字符,同时确认SQL Server LocalDB服务已启动。

内容的提问来源于stack exchange,提问作者Amjad Shubbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:37