如何调试 "Invalid index X for this SqlParameterCollection with Count X"
How do I debug "Invalid index X for this SqlParameterCollection with Count X"
我正在开发一个用 C# 编写并使用 Fluent NHibernate 的项目。我遇到了臭名昭著的异常 "Invalid index X for this SqlParameterCollection with Count X"。我已经尝试了来自不同 SO solutions 的几个建议,但我就是找不到映射问题。
读取数据时不会出现错误,只会在更新时出现。正在更新的 table 非常简单,因此 table 的地图也很简单。当更新发生时,NHibernate 构造一个简单的 table 更新查询,因此当错误发生时实际上并没有发生太多事情。
我的更新代码包含在一个交易中
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 列表以便我可以看到不属于的内容。
作为一个有幸参与凌乱的遗留 Nhibernate 项目的人,我提出以下建议,让您的生活更轻松,并在充满敌意的领土上生存下来:
1- "If" 您的数据库是 SQL 服务器:打开 SQL Server profiler 并应用所需的过滤器(数据库名称和命令文本),以便您看到 sql命令被准确地传递到服务器。对我来说,这将是起点。
2- 如果 SQL 服务器不是您的 back-end 引擎,您在调试时最好的朋友将是 NHibernate profiler。通过显示传递给服务器的每个参数的值以及最终查询,这正是您要查找的内容。它还显示打开的会话以及它们是否关闭。大家可以下载试用版看看
3- 对于未来的代码手术,始终将您的项目配置为按需打开跟踪:按照 NLog with Nhibernate 记录哪些 sql 语句被传递到 sql 服务器并保存它们在单独的日志中。
以上工具和建议是我会尝试的,如果我遇到你的情况的话。
作为最后的提示:如果您使用上述方法未能找到问题,请自行解决问题并运行 使用您自己的 SQL 本地语句进行更新.有时弄清楚为什么 NHibernate 没有生成所需的 SQL 语句比手动创建和执行更新语句花费更多的时间。这是你的最后一枪。听起来可能不干净,但大多数 NHibernate 项目都不干净。
我正在开发一个用 C# 编写并使用 Fluent NHibernate 的项目。我遇到了臭名昭著的异常 "Invalid index X for this SqlParameterCollection with Count X"。我已经尝试了来自不同 SO solutions 的几个建议,但我就是找不到映射问题。
读取数据时不会出现错误,只会在更新时出现。正在更新的 table 非常简单,因此 table 的地图也很简单。当更新发生时,NHibernate 构造一个简单的 table 更新查询,因此当错误发生时实际上并没有发生太多事情。
我的更新代码包含在一个交易中
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 列表以便我可以看到不属于的内容。
作为一个有幸参与凌乱的遗留 Nhibernate 项目的人,我提出以下建议,让您的生活更轻松,并在充满敌意的领土上生存下来:
1- "If" 您的数据库是 SQL 服务器:打开 SQL Server profiler 并应用所需的过滤器(数据库名称和命令文本),以便您看到 sql命令被准确地传递到服务器。对我来说,这将是起点。
2- 如果 SQL 服务器不是您的 back-end 引擎,您在调试时最好的朋友将是 NHibernate profiler。通过显示传递给服务器的每个参数的值以及最终查询,这正是您要查找的内容。它还显示打开的会话以及它们是否关闭。大家可以下载试用版看看
3- 对于未来的代码手术,始终将您的项目配置为按需打开跟踪:按照 NLog with Nhibernate 记录哪些 sql 语句被传递到 sql 服务器并保存它们在单独的日志中。
以上工具和建议是我会尝试的,如果我遇到你的情况的话。
作为最后的提示:如果您使用上述方法未能找到问题,请自行解决问题并运行 使用您自己的 SQL 本地语句进行更新.有时弄清楚为什么 NHibernate 没有生成所需的 SQL 语句比手动创建和执行更新语句花费更多的时间。这是你的最后一枪。听起来可能不干净,但大多数 NHibernate 项目都不干净。