为了账号安全,请及时绑定邮箱和手机立即绑定

如何调试“此带有计数 X 的 SqlParameterCollection 的索引 X 无效”

如何调试“此带有计数 X 的 SqlParameterCollection 的索引 X 无效”

C#
繁华开满天机 2023-04-29 15:34:32
我正在开发一个用 C# 编写并使用 Fluent NHibernate 的项目。我收到臭名昭著的异常“此 SqlParameterCollection 的索引 X 与计数 X”。我已经尝试了来自不同 SO解决方案的几个建议,但我就是找不到映射问题。读取数据时不会发生错误,只会在更新时发生。正在更新的表非常简单,因此该表的地图也很简单。当更新发生时,NHibernate 构造一个简单的单表更新查询,因此当错误发生时实际上并没有发生太多事情。我的更新代码包含在交易中using (var tx = Session.BeginTransaction()){    try    {         result = PerformUpdate(obj, modifiedBy);         if (result.Succeeded)         {             tx.Commit();             Session.Flush();         }         else              RollbackTransaction(tx);         return result;      }      catch (Exception ex)      {          tx.Rollback();          throw;      }   }}在 tx.Commit() 上抛出异常。我相当有信心这是架构中某处的映射问题,但我找不到它。 如何检查 SqlParameters 列表以便调试它?必须有一种方法来检查 SqlParameters 列表,以便我可以看到不属于的内容。
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

作为一个曾不幸与凌乱的遗留 Nhibernate 项目一起工作的人,我提出以下建议,让你的生活更轻松,并在充满敌意的领土上生存下来:

1-“如果”您的数据库是 SQL Server:打开SQL Server 探查器并应用所需的过滤器(数据库名称和命令文本),以便您看到哪些 sql 命令被准确传递到服务器。对我来说,这将是起点。

2- 如果 SQL Server 不是你的后端引擎,你在调试时最好的朋友是NHibernate 分析器。通过显示传递给服务器的每个参数的值以及最终查询,这正是您要查找的内容。它还显示打开的会话以及它们是否关闭。你可以下载试用版看看。

3- 对于未来的代码手术,始终将您的项目配置为按需打开跟踪:使用Nhibernate 跟踪 NLog以记录正在传递给 sql server 的 sql 语句并将它们保存在单独的日志中。

上面的工具和建议是我会尝试的,如果我被困在你的情况下。

作为最后的提示:如果您使用上述方法未能找到问题,请自行解决问题并使用您自己的 SQL 本机语句运行更新。有时弄清楚为什么 NHibernate 没有生成所需的 SQL 语句比手动创建和执行更新语句花费更多的时间。这是你的最后一枪。听起来可能不干净,但大多数 NHibernate 项目无论如何都不干净。


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信