Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемка с Data Reader.

39K
21 декабря 2009 года
b00B1uK
31 / / 08.06.2009
Пишу рссчёт кварт платы. Делаю черещ Data Reader'ы

Код:
SqlConnection conect = new SqlConnection("Data Source=B00B1UK-ПК\\SQLEXPRESS;Initial Catalog=tsg;Integrated Security=True");
            conect.Open();
            SqlCommand comand = conect.CreateCommand();
            comand.CommandText = "SELECT COUNT(Жильцы.[Идентификатор жильца]) AS [Количесвтво жильцов], Квартиры.[Идентификатор квартирв], Квартиры.Площадь FROM dbo.Квартиры INNER JOIN dbo.Жильцы ON Квартиры.[Идентификатор квартирв] = Жильцы.[Идентификатор квартиры]GROUP BY Жильцы.[Идентификатор квартиры], Квартиры.[Идентификатор квартирв], Квартиры.Площадь";
            comand.CommandType = CommandType.Text;
            SqlDataReader LivDataReader = comand.ExecuteReader();

            SqlConnection conect1 = new SqlConnection("Data Source=B00B1UK-ПК\\SQLEXPRESS;Initial Catalog=tsg;Integrated Security=True");
            conect1.Open();
            SqlCommand comand1 = conect1.CreateCommand();
            comand1.CommandText = "SELECT  [Идентификатор тарифа], [Единица измерения], [Название тарифа], Тариф FROM dbo.Тарифы";
            SqlDataReader TarDataReader=comand1.ExecuteReader();
                double res=0,tar=0;
                while(LivDataReader.Read())
                {
                 while(TarDataReader.Read())
                    {
                        if(TarDataReader.GetString(1).Equals("pls"))
                        {
                            tar = TarDataReader.GetDouble(3);
                            res = LivDataReader.GetInt32(2) * tar;
                        }
                        if (TarDataReader.GetString(1).Equals("ppl"))
                        {
                            tar = TarDataReader.GetDouble(3);
                            res = LivDataReader.GetInt32(0) * tar;
                        }
                 this.счета_к_оплатеTableAdapter1.InsertQuery(TarDataReader.GetInt32(0), LivDataReader.GetInt32(1), res);

                 }
                }
        }


Код работает корректно, но только для первой квартиры. Считает первую квартиру для всех тарифов и потом просто пролетает все остальные. Подскажите, пожалуйста , как быть? Оч срочно надо!
1.9K
22 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Касательно, вопроса - возможно надо использовать NextResult (Извлечение нескольких результирующих наборов при помощи NextResult)
39K
22 декабря 2009 года
b00B1uK
31 / / 08.06.2009
Подумал тут основательно. Выглядит так, что TarDataReader делает один цикл, по всем записям и потом уже данных в нём как бы нет. Нужно видимо сбросить как-то его.
Как вариант, думаю, мона каждый оборот LivDataReader.Read() закрывать TarDataReader и читат его заново, но это мне кажется вариант "через оПу".
5
22 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: b00B1uK
Подумал тут основательно. Выглядит так, что TarDataReader делает один цикл, по всем записям и потом уже данных в нём как бы нет. Нужно видимо сбросить как-то его.
Как вариант, думаю, мона каждый оборот LivDataReader.Read() закрывать TarDataReader и читат его заново, но это мне кажется вариант "через оПу".


Что мешает произвести расчет на SQL-сервере (например, через хранимую процедуру), а клиенту отдать результат?

1.9K
22 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Прошу прощения, я немного не в ту степь направил.

Лучшим вариантом здесь будет по-отдельности выбрать и сохранить результаты запросов в какую-нибудь коллекцию (либо воспользоваться DataSet+DataAdapter). А потом уже делать с ними все что угодно.
1.9K
22 декабря 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: hardcase
Что мешает произвести расчет на SQL-сервере (например, через хранимую процедуру), а клиенту отдать результат?


Я тоже сначала хотел про это написать, а потом подумал, что это только курсорами реализуется. Или курсоры это нормальная практика для таких ситуаций?

5
22 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: GreenRiver
Я тоже сначала хотел про это написать, а потом подумал, что это только курсорами реализуется. Или курсоры это нормальная практика для таких ситуаций?


Практика-то нормальная, хотя, конечно, в трехзвенной архитектуре лучше такие вещи в серверном приложении производить, а не в СУБД.

Автору. Чтобы произвести расчет нужно иметь связь между тарифами и квартирами, судя по запросам, ее нет совсем. Кроме того очень смущают названия таблиц и полей на русском языке: тебе самому-то удобно набирать их с постоянным переключением раскладки? Особенно впечатлила запись [Идентификатор квартиры], в то время как нормальные люди просто написали бы две буквы - id.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог