【问题标题】:MySQL Reader closing immediatelyMySQL Reader 立即关闭
【发布时间】:2016-10-05 12:06:33
【问题描述】:

我有一个递归填充列表的方法。首先它选择父项,然后使用外键选择它可能拥有的任何子项。它可以很好地选择父项,但是当它开始选择子项时,Reader 会无缘无故关闭。

我已经在调试器中完成了它,我没有理由看到它正在关闭。搜索参数有效,搜索返回项目(我手动检查过),Reader 处于活动状态。然而由于某种原因,它一打开就关闭,没有任何错误。

  • 连接字符串有效
  • 阅读器有效
  • 搜索参数有效
  • 命令返回结果(我专门测试了这个-WHERE 1 = 1 AND SE.ParentSE = 4;";有超过10个结果)

不知道怎么回事?

try
{
    using (MySqlConnection connection = new MySqlConnection(GetConnectionString()))
    {
        connection.Open();

        using (MySqlCommand command = connection.CreateCommand())
        {
            command.CommandText = @"SELECT 
                                    SE.SEId,
                                    SE.Name,
                                    SE.Status,
                                    SE.Description,
                                    SE.ParentME AS ParentMEId,
                                    SE.ParentSE AS ParentSEId,
                                    SE.Comments AS Comments,
                                    SE.Removed AS Removed,
                                    SE.SupplierId AS SupplierId,
                                    TC.TerminalCount AS TerminalCount,
                                    SE2.Name AS ParentSE,
                                    ME.EquipmentNumber AS ParentME,
                                    D.DSId AS DataSheet,
                                    D.DSType AS DataSheetType,
                                    C.Code AS EquipmentType,
                                    C.Description AS TypeDescription,
                                    C.CodeType AS TypeDiscipline,
                                    SE.EquipmentType AS EquipTypeId,
                                    SE3.SEId AS SE3Id,
                                    SE4.SEId AS SE4Id,
                                    SE5.SEId AS SE5Id,
                                    SE6.SEId AS SE6Id,
                                    SE2.ParentME AS ME2Id,
                                    SE3.ParentME AS ME3Id,
                                    SE4.ParentME AS ME4Id,
                                    SE5.ParentME AS ME5Id,
                                    SE6.ParentME AS ME6Id,
                                    PAC.UDCId AS AreaCodeId,
                                    PAC.Code AS AreaCode,
                                    PAC.Description AS AreaCodeDescription
                                FROM SubEquipment SE
                                LEFT  JOIN DataSheet D ON SE.SEId = D.SEId
                                LEFT JOIN (SELECT SEId, COUNT(*) as TerminalCount FROM Terminal GROUP BY SEId) TC ON SE.SEId = TC.SEId
                                LEFT JOIN SubEquipment SE2 ON SE.ParentSE = SE2.SEId
                                LEFT JOIN MajorEquipment ME ON SE.ParentME = ME.MEId
                                LEFT JOIN UserDefinedCode C ON C.UDCId = SE.EquipmentType
                                LEFT JOIN SubEquipment SE3 ON SE2.ParentSE = SE3.SEId
                                LEFT JOIN SubEquipment SE4 ON SE3.ParentSE = SE4.SEId
                                LEFT JOIN SubEquipment SE5 ON SE4.ParentSE = SE5.SEId
                                LEFT JOIN SubEquipment SE6 ON SE5.ParentSE = SE6.SEId
                                INNER JOIN MajorParentage MP ON SE.SEId = MP.SEId
                                INNER JOIN MajorEquipment MEU ON MP.MEId = MEU.MEId
                                INNER JOIN UserDefinedCode PAC ON MEU.PACId = PAC.UDCId
                                LEFT JOIN ComponentStatus CS1 ON CS1.StatusName = SE.Status
                                WHERE 1 = 1"
                                // " AND SE.ParentSE = @SEParentId"                                    
                                // @SEParentId = 4
                                + parentSearch
                                + ";";

            command.Parameters.AddWithValue("@PACId", areaCodeId);
            command.Parameters.AddWithValue("@AreaCode", areaCode.Cipher());
            command.Parameters.AddWithValue("@ETId", equipmentTypeId);
            command.Parameters.AddWithValue("@EquipmentType", equipmentType.Cipher());
            command.Parameters.AddWithValue("@EquipmentNumber", equipmentNumber.Cipher());
            command.Parameters.AddWithValue("@Description", description.Cipher());
            command.Parameters.AddWithValue("@Comments", comments.Cipher());
            command.Parameters.AddWithValue("@TypeDiscipline", typeDiscipline);
            command.Parameters.AddWithValue("@MEParentId", parentMEId);
            command.Parameters.AddWithValue("@MEParent", parentMENumber.Cipher());
            command.Parameters.AddWithValue("@SEParentId", parentSEId);
            command.Parameters.AddWithValue("@SEParent", parentSENumber.Cipher());
            command.Parameters.AddWithValue("@SEId", excludeSEId);
            command.Parameters.AddWithValue("@Status", status.Cipher());

            using (MySqlDataReader reader = command.ExecuteReader())
            {
                // Read all the results and populate a model with them.
                while (reader.Read())
                {
                    // Do stuff...
                }
                // Finished reading the results
                if (!reader.IsClosed)
                    reader.Close();
            }
        }

        // Finished with the connection
        if (connection.State == System.Data.ConnectionState.Open)
            connection.Close();
    }
}
catch (MySqlException e)
{
    ShowMySQLError(e, 4417);
}

【问题讨论】:

  • 您是否尝试过不包含 if 语句来关闭 Reader 的连接?
  • 我让使用资源为我放弃了它。他说了什么。
  • 无论如何都没有变化。我只是将其作为预防措施投入使用-我们的团队非常谨慎,我们之前遇到过未处理的问题。我知道using 正常处理它,但我们只是说我们是偏执狂
  • 递归因素在哪里?多少级?如果您在一段时间后需要帮助,请考虑将可重现的 sqlfiddle 与创建包含数据的表(sqlfiddle 或其他)捆绑在一起并提供全部内容。因为现在它可能只是代码的一小部分。
  • 等一下。您正在向甚至不带参数的查询添加值。也许您从其他代码中意外剪切并粘贴了 AddWithValue 块,它是错误的,不会触发 try/catch,并且稍后会内爆。

标签: c# mysql reader


【解决方案1】:

找到了。

该方法在整个程序中的多个地方都使用过;但由于某种原因,只有 this 调用意外关闭了Reader。仔细检查 - 阅读器的属性显示它没有行:HasRows = false。表示查询有问题。

我再次查看,发现问题是一个被忽略的参数(为了这个问题,我对其进行了修剪 - 我认为没有必要)。有几个默认的boolean 参数,一个设置为true,导致查询返回空结果。

故事的寓意:了解您的代码在做什么!

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 2020-08-22
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多