powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / метод sqldatareader и хранимые процедуры
17 сообщений из 17, страница 1 из 1
метод sqldatareader и хранимые процедуры
    #38377203
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,возникло 2 вопроса, что не так делаю?
1)
Работаю с базой MS SQL 2008. Для запросов типа select,insert... и малых конструкций использовал sqlcommand и ExecuteNonQuery();
Возникла проблема:
в коде такая конструкция:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
            con.Open();
            SqlCommand cln = new SqlCommand();
            cln = con.CreateCommand();
            cln.CommandText = "select a1,a2,a3 from base";
            sqlreader1 = cln.ExecuteReader(); // sqldatereader sqlreader1, т.е. мне нужен набор данных по селекту

            SqlCommand current_acc = new SqlCommand();
            current_acc = con.CreateCommand();



            while (sqlreader1.Read()) // здесь прохожу по циклу по набору из первого селекта
            {
            
                current_acc.CommandText = "select a4,v1,d2 from s1";
                sqlreader2 = current_acc.ExecuteReader(); (3*)
                iCounterRow = iBeginRowClient;
                while (sqlreader2.Read()) // прохожусь по второму набору данных
                {
//здесь выгрузка в excel
                    ex.SetValue("E" + Convert.ToString(iCounterRow), sqlreader2["Name"].ToString().ToUpper().Replace("ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ", "ООО").Replace("ОТКРЫТОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО", "ОАО").Replace("ЗАКРЫТОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО", "ЗАО"));
                    ex.SetValue("D" + Convert.ToString(iCounterRow), sqlreader2["code"].ToString());
                    ex.SetValueInt("F" + Convert.ToString(iCounterRow), Convert.ToString(sqlreader2["SUM_RUB"]));
                    iCounterRow++;
                    sqlreader2.Close();
                }
                iMaxRowClient = iCounterRow;
                
                sqlreader2.Close(); // закрываю датаридер
                current_acc.Cancel(); // выхожу из команды
 

        
            }
            ex.Visible = true;
            ex.SaveDocument(Application.StartupPath + "\\Doc" + ".xls");
            sqlreader1.Close(); // закрываю основной дата ридер
            cln.Cancel(); // выхожу из команды cln
            con.Close(); // закрываю соединение sql



при выполнении возникает ошибка , (на этой строке 3*), существует назначенный этой команде открытый датаридер, который нужно предварительно закрыть. Вроде все закрываю, ни черта не получается.
2) на том же сервере есть хранимая процедура, выполняется долговато,связано с расчетом/разбором больших таблиц, минимум это секунд 40-50.
код такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
                string conSQL = @"Data Source=**********************";
                SqlConnection con = new SqlConnection(conSQL);
                SqlCommand sqlcom = new SqlCommand();
                sqlcom = con.CreateCommand();
                sqlcom.CommandType = CommandType.StoredProcedure;
                sqlcom.CommandText = "AVG_BL";
                sqlcom.Parameters.Clear();
                SqlParameter d1 = sqlcom.Parameters.Add("@dtn", SqlDbType.Date);
                SqlParameter d2 = sqlcom.Parameters.Add("@dtx", SqlDbType.Date);
                d1.Direction = ParameterDirection.Input;
                d2.Direction = ParameterDirection.Input;
                d1.Value = dateTimePicker1.Value;
                d2.Value = dateTimePicker2.Value;
                con.Open();
                sqlcom.ExecuteNonQuery();
                sqlcom.Cancel();
                con.Close();


возникает ошибка:"Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает."
Как избавиться от такого?
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38377206
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сразу допишу, что селекты из первого вопроса изменил, не обращайте внимания на поля
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38377271
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Либо закройте sqlreader1 до того как открыть второй (sqlreader2 = current_acc.ExecuteReader()), либо научитесь пользоваться поиском: Два DataReader-а - как открыть оба ;
2. Почитайте MSDN: SqlCommand.CommandTimeout .
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38378941
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA1. Либо закройте sqlreader1 до того как открыть второй (sqlreader2 = current_acc.ExecuteReader()), либо научитесь пользоваться поиском: Два DataReader-а - как открыть оба ;
2. Почитайте MSDN: SqlCommand.CommandTimeout .

спасибо,
по 1 - попробал
по 2 пока нет.
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38378963
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, а можете подсказать,как оптимизировать?
как писал выше,есть дата ридеры,на самом деле их 5 датаридеров, первый основной, остальные четыре с ним связаны, 4 нужны для определенных таблиц,данных,расчетов.
т.е.
1 ридер - данные по клиенту (ид,инн,бизнес итд)
2 ридер - расчеты по текущим счетам
3.ридер - расчеты по депозитам
итд
все это выгружается в excel
работает чрезвычайно долго, понятное дело,то что проход сначала по клиентам, около 50000, внутри по остальным.
итогвый файл получается примерно таким
ид - номер счета - наименование - текущие счета(остаток) - текущие счета(доход) ...расход итд ... .также по депозитам итд

как лучше сделать?
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38378972
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я б подумал в сторону сделать хранимку, получающую единый результат и отдающую в виде xml
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379055
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паганель,

Спасибо за ответ,думал я сделать через хранимую, а другой способ есть,более производительный?чем циклы в цикле или хранимая
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379066
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хранимку правильно написать, она будет производительной
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379117
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellРебят, а можете подсказать,как оптимизировать?
как писал выше,есть дата ридеры,на самом деле их 5 датаридеров, первый основной, остальные четыре с ним связаны, 4 нужны для определенных таблиц,данных,расчетов.
т.е.
1 ридер - данные по клиенту (ид,инн,бизнес итд)
2 ридер - расчеты по текущим счетам
3.ридер - расчеты по депозитам
итд
все это выгружается в excel
работает чрезвычайно долго, понятное дело,то что проход сначала по клиентам, около 50000, внутри по остальным.
итогвый файл получается примерно таким
ид - номер счета - наименование - текущие счета(остаток) - текущие счета(доход) ...расход итд ... .также по депозитам итд

как лучше сделать?1. Если итоговые данные - это одна плоская таблица Excel, то можно ограничится одним запросом. Это будет либо SELECT с нужными JOIN, либо представление (View), либо хранимая процедура;
2. Судя по Вашему коду, Вы вставляете данные в Excel по ячейкам, это будет очень долго (и скорее всего это и есть узкое место). Нужно вставлять либо целую строку, либо целую таблицу, то есть использовать Excel Range.
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379126
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, да, кстати... а может вообще какой-то Report Engine автору заюзать...
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379240
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAdenis_stellРебят, а можете подсказать,как оптимизировать?
как писал выше,есть дата ридеры,на самом деле их 5 датаридеров, первый основной, остальные четыре с ним связаны, 4 нужны для определенных таблиц,данных,расчетов.
т.е.
1 ридер - данные по клиенту (ид,инн,бизнес итд)
2 ридер - расчеты по текущим счетам
3.ридер - расчеты по депозитам
итд
все это выгружается в excel
работает чрезвычайно долго, понятное дело,то что проход сначала по клиентам, около 50000, внутри по остальным.
итогвый файл получается примерно таким
ид - номер счета - наименование - текущие счета(остаток) - текущие счета(доход) ...расход итд ... .также по депозитам итд

как лучше сделать?1. Если итоговые данные - это одна плоская таблица Excel, то можно ограничится одним запросом. Это будет либо SELECT с нужными JOIN, либо представление (View), либо хранимая процедура;
2. Судя по Вашему коду, Вы вставляете данные в Excel по ячейкам, это будет очень долго (и скорее всего это и есть узкое место). Нужно вставлять либо целую строку, либо целую таблицу, то есть использовать Excel Range.

А что вы подразумеваете под "это одна плоская таблица Excel"? т.е. итоговая таблица это сбор всех данных, расходов/доходов/комиссий, фиктивных/фактических ставок по различным бизнесам итд, это все по счетам в разрезе клиентов+итоговые данные
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379243
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,
по 2. пункту Вы правы, вставляю данные по ячейкам
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379543
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellskyANAпропущено...
1. Если итоговые данные - это одна плоская таблица Excel, то можно ограничится одним запросом. Это будет либо SELECT с нужными JOIN, либо представление (View), либо хранимая процедура;
2. Судя по Вашему коду, Вы вставляете данные в Excel по ячейкам, это будет очень долго (и скорее всего это и есть узкое место). Нужно вставлять либо целую строку, либо целую таблицу, то есть использовать Excel Range.

А что вы подразумеваете под "это одна плоская таблица Excel"?Одна таблица, без группировок, на одном листе.
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379546
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellskyANA,
по 2. пункту Вы правы, вставляю данные по ячейкамА надо данные кучей вставлять (Range)
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379626
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,
Не совсем так, группировка есть, одна по счетам в разрезе клиента.
Никогда не работал с range, поэтому не совсем понимаю, вставляю данные через SetValue. Если у Вас есть, можете примерчиком в меня кинуть?
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38379671
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell, выложите пример получившегося файла Excel.
...
Рейтинг: 0 / 0
метод sqldatareader и хранимые процедуры
    #38383443
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

я извиняюсь,что сразу не ответил, был занят.
прикладываю шаблон файла, который выгружается, нужно чтобы группировались данные в файле по клиенту, в принципе можно группировать по ид или по имени
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / метод sqldatareader и хранимые процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]