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
相关产品推荐
相关产品推荐

