如何调试“此CountParameter X的SqlParameterCollection的无效索引X”

时间:2019-06-21 14:13:50

标签: c# fluent-nhibernate

我正在研究一个用C#编写并使用Fluent NHibernate的项目。我收到了臭名昭著的异常“此CountParameter X的SqlParameterCollection的无效索引X”。我尝试了来自不同SO solutions的一些建议,但我只是找不到映射问题。

仅在更新时,读取数据时永远不会发生错误。要更新的表非常简单,因此该表的映射也很简单。当更新发生时,NHibernate会构造一个简单的单表更新查询,因此发生错误时实际上并没有发生什么。

我的更新代码包含在交易中

Sub Main()

    Dim s1 As String() = {"a", "b", "c", "d"}
    Dim s2 As Integer() = {1, 2, 3}

    Console.WriteLine("Nested For Each Loops")
    For Each s1Item As String In s1
        For Each s2Item As Integer In s2
            Dim m As String = $"{s1Item}, {s2Item}"
            Console.WriteLine(m)
        Next
    Next
    Console.WriteLine()

    Console.WriteLine("Single For Loop, leveraging array indices")
    Dim itemsLengthMinimum As Integer = {s1.Length, s2.Length}.Min()
    For itemsIndex As Integer = 0 To itemsLengthMinimum - 1
        Dim s1Item As String = s1(itemsIndex)
        Dim s2Item As Integer = s2(itemsIndex)
        Dim m As String = $"{s1Item}, {s2Item}"
        Console.WriteLine(m)
    Next
    Console.WriteLine()

    Console.WriteLine("Single For Each Loop, using Zip to return Object array")
    For Each pairedItem As Object() In s1.Zip(s2, Function(s1Item, s2Item) {s1Item, s2Item})
        Dim m As String = $"{pairedItem(0)}, {pairedItem(1)}"
        Console.WriteLine(m)
    Next
    Console.WriteLine()

    Console.WriteLine("Single For Each Loop, using Zip to return Tuple")
    For Each pairedItem As Tuple(Of String, Integer) In s1.Zip(s2, Function(s1Item, s2Item) New Tuple(Of String, Integer)(s1Item, s2Item))
        Dim m As String = $"{pairedItem.Item1}, {pairedItem.Item2}"
        Console.WriteLine(m)
    Next
    Console.WriteLine()

    Console.WriteLine("Press any key to end...")
    Console.ReadKey()

End Sub

在tx.Commit()上引发了异常。

我非常有信心这是架构中某处的映射问题,但我找不到它。 如何检查SqlParameters列表以便调试?必须有一种检查SqlParameters列表的方法,以便查看不属于什么。

1 个答案:

答案 0 :(得分:3)

作为一个不幸的人,他很高兴与混乱的传统Nhibernate项目一起工作,我建议您采取以下措施,使您的生活更轻松,并在充满敌意的领土中生存:

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

2-如果SQL Server不是您的后端引擎,那么在调试时最好的朋友是NHibernate profiler。通过显示传递给服务器的每个参数的值以及最终查询,可以完全满足您的需求。它还显示打开的会话以及它们是否关闭。您可以下载试用版并查看。

3-为了将来进行代码外科手术,请始终将项目配置为按需打开跟踪:按照NLog with Nhibernate记录要传递到sql server的sql语句,并将它们保存在单独的日志中。

如果我会陷入困境,以上是我会尝试的工具和建议。

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