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

    +134

    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
    protected static DataTable[] ExecuteDataTablesReader(string ProcedureName, SqlParameter[] Params = null) {
    
                SqlConnection cnn = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand(ProcedureName, cnn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                if (Params != null && Params.Count() > 0) {
                    cmd.Parameters.AddRange(Params);
                }
                cnn.Open();
                
                IDataReader rd = cmd.ExecuteReader();
                List<DataTable> tables = new List<DataTable>();
                do {
                    DataTable dt = new DataTable();
                    dt.Load(rd);
                    tables.Add(dt);
                } while (rd.NextResult());
    
                return tables.ToArray();
    
            }

    может я чего не понимаю, но какого хера rd.NextResult() кидает мне exception, что ридер закрыт?

    Запостил: Lokich, 26 Ноября 2014

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

    • Потому что DataTable.Load(IDataReader reader, ...) закрывает ридер, когда нет больше данных. Но в этом коде проблемы похлеще, чем exception...
      Ответить
      • http://msdn.microsoft.com/ru-ru/library/system.data.datatable.load(v=vs.110).asp x что-то я тут ни слова не нашел об этом.
        в любом случае, он закрывался перед чтением последнего рекордсета. если их два - падал при чтении второго, если три - при третьем.
        Ответить
        • Это [url=http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs,4463]undocumented feature[/url] (surprise!).
          Ответить
          • эх, запорол ссылку - http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs,4463
            Ответить
          • if (!reader.IsClosed && !reader.NextResult()) { // 
                                reader.Close();
                            }
            да они там совсем ебанулись чтоли???? какого хуя они на следующий рекордсет переходят?
            Ответить
            • Потому что ты неправильно используешь DataTable в этом куске (и ваще весь ADO.NET)
              Ответить
              • что конкретно не так?
                Ответить
                • Честно? Всё. Не закрываешь соединение, используешь DataTable, делаешь список из них, когда можно использовать DataSet через DataAdapter.
                  Ответить
                  • на все есть свои причины. данная версия была написана исключительно для теста, так как я грешил, что он рвет коннект до окончания блока, а так я без using такие вещи не пишу.
                    не вижу проблем в использовании DataTable. а вообще, конкретно тут они используются для того, чтобы выгружать DataTable на каждый лист xlsx в Epplus (благо там это делается одной строчкой).
                    а список я делал, чтобы не переопределять размер массива. да, плохо, но я ленивый.
                    SqlDataAdapter штука конечно же ужасно удобная, и при этом медленная.
                    Ответить
            • а что такого ? Если не закрыто и нельзя перейти дальше закрываем. По моему логично.
              Ответить
              • если ты не заметил, то у меня цикл do while стоит. когда я вызываю NextResult() он мне возвращает bool, по которому я понимаю, есть ли следующий рекордсет. если рекордсет есть, то reader переключается на него, и работает в его контексте.
                Ответить
                • проверяй !reader.IsClosed
                  Ответить
                  • ты когда за рулем едешь, тоже проверяешь, что тебе никто на тормоза не нажал? в любом случае проблема не в закрытом ридере, а что он мне рекордсеты сам переключает.
                    Ответить

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