开发者社区 问答 正文

LinqToSQL不更新数据库

// goal: update Address record identified by "id", with new data in "colVal" string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str using (DataContext db = new DataContext(cstr)) { Address addr = (from a in db.GetTable () where a.Id == id select a).Single(); addr.AddressLine1 = colValue.Trim(); db.SubmitChanges(); // this seems to have no effect!!! } 在调试器中,addr具有db表中的所有当前值,并且我可以在调用db.SubmitChanges()之前验证AddressLine1是否已更改。执行SubmitChanges行时,SQL Profiler仅显示“重置连接”。任何人都知道为什么这不起作用?谢谢!

展开
收起
SONGYiiiD 2019-12-03 22:49:24 677 分享 版权
阿里云 AI 助理回答

根据您提供的代码片段,看起来您正在使用LINQ to SQL来与数据库交互并尝试更新Address表中的一条记录。您遇到的问题是调用db.SubmitChanges()后,更改没有实际反映到数据库中,且SQL Profiler仅显示“重置连接”。

这里有几个可能的原因和相应的解决建议:

  1. 事务配置问题:在某些情况下,DataContext的事务设置可能导致提交不生效。虽然默认情况下DataContext应该能正确管理事务,但您可以显式地在一个事务中执行操作以确保提交逻辑:

    using (var transaction = db.Connection.BeginTransaction())
    {
       try
       {
           // 您的更新逻辑
           Address addr = (from a in db.GetTable<Addresses>() where a.Id == id select a).Single();
           addr.AddressLine1 = colValue.Trim();
    
           db.SubmitChanges();
           transaction.Commit();
       }
       catch
       {
           transaction.Rollback();
           throw;
       }
    }
    
  2. 数据库上下文生命周期问题:确保DataContext实例在执行整个查询和提交更改的过程中都是有效的。您的代码看起来已经正确处理了这一点,但在更复杂的场景中,如果DataContext过早被释放或重新创建,可能会导致问题。

  3. 数据库权限问题:确认用于连接数据库的用户具有足够的权限来修改Address表的数据。如果权限不足,更新操作会被数据库拒绝,但通常这会抛出异常而不是静默失败。

  4. SQL Server触发器影响:检查数据库中是否有针对Address表的触发器,这些触发器可能会在数据更新时进行额外的操作,甚至回滚事务。

  5. 日志查看:除了SQL Profiler之外,检查数据库的日志文件,看是否有关于这个更新操作的错误信息或者警告。

  6. 模型映射问题:确认LINQ to SQL的映射(DBML文件或代码中的映射)正确无误,特别是对于Address实体及其属性的映射。

如果以上建议都不能解决问题,建议您通过调试进一步深入,比如检查db.ChangeConflicts属性看是否有冲突,或者启用更详细的日志记录来捕获潜在的错误信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: