1. C# / Говнокод #18460

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    /// <summary>
            /// Обновление данных о объекте
            /// </summary>
            /// <param name="theObject">ссылка на объект</param>
            public void Update(IPersistentObject theObject)
            {
                IDbCommand updateCommand = null;
                try
                {
                    using (updateCommand = CreateUpdateCommand(theObject))
                    {
                        updateCommand.Connection.Open();
                        updateCommand.ExecuteNonQuery();
                    }
                }
                catch (DbException ex)
                {
                    int code = 0;
                    if (ex is SqlException)
                    {
                        code = ((SqlException) ex).Number;
                    }
                    if (code == 229)
                    {
                        ex.Data.Add("Name", theObject.ClassInfo.Name);
                        ex.Data.Add("Description", theObject.ClassInfo.Description);
                        ex.Data.Add("Action", "UPDATE");
                        throw new InvalidOperationException(
                            String.Format("Ошибка обновления объекта [{0}] - {1} (ID = '{2}')",
                                          theObject.ClassInfo.Name,
                                          theObject.ClassInfo.Description,
                                          theObject.ID), ex);
                    }
                    if (code == 207 || code == 208)
                    {
                        throw new InvalidColumnException(theObject.ClassInfo, ex);
                    }
                    //theObject заменен на theObject.ID. Нечитабельно, но ... Т. к. при вычислении ToString()
                    //для показа объекта иногда задействуются методы загрузки данных
                    //названия объекта. Таким образом при высоком уровне изоляции транзакции
                    //мы получим зависание если будет попытка загрузить данные заблокированные транзакцией.
                    TraceLogger.Log(String.Format("Update {0}({1}){4} - {2}\n{3}", theObject.ID, theObject.ClassInfo,
                                                  ex.Message, ex.InnerException, theObject.GetInfoToTraceMessage()),
                                    TraceTypeEnum.UpdateStatement);
                    throw;
                }
                finally
                {
                    if (updateCommand != null)
                    {
                        updateCommand.Connection.Close();
                    }
                }
            }

    смертельный прием using
    и добьем соперника используя finally как фаталити

    перехват исключения тоже хорош, авторский комментарий добавляет изюминку

    Запостил: vldalx, 10 Июля 2015

    Комментарии (6) RSS

    • ну, обработка исключения конечно не айс, но в целом using и finally вполне себе.
      Ответить
      • категорически не согласен с
        > using и finally вполне себе
        приведенный код аналогичен

        IDbCommand updateCommand = null;
        try
        {
        try
        {
        updateCommand = CreateUpdateCommand(theObject)
        updateCommand.Connection.Open();
        updateCommand.ExecuteNonQuery();
        }
        finally
        {
        if (updateCommand != null)
        {
        updateCommand.Dispose();
        }
        }
        }
        catch (DbException ex)
        {
        ....
        }
        finally
        {
        if (updateCommand != null)
        {
        updateCommand.Connection.Close();
        }
        }

        вызов Dispose() у DbCommand закрывает Connection (или тут у меня проблемы с мат. частью)

        ЗЫ тоже самое здесь говорят http://stackoverflow.com/questions/1423391/will-dbcommand-close-close-the-connection-as-well
        Ответить
        • [code]попробуйте так[/code]:
          Dispose()
          Ответить
          • спсибо, в обозримом будущем обязательно попробую
            Ответить
            • а то если не попробуешь - не будет у тебя будущего...
              Ответить
    • FAT ALITY
      Ответить

    Добавить комментарий