Проблемка с Data Reader.
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);
}
}
}
Код работает корректно, но только для первой квартиры. Считает первую квартиру для всех тарифов и потом просто пролетает все остальные. Подскажите, пожалуйста , как быть? Оч срочно надо!
Как вариант, думаю, мона каждый оборот LivDataReader.Read() закрывать TarDataReader и читат его заново, но это мне кажется вариант "через оПу".
Как вариант, думаю, мона каждый оборот LivDataReader.Read() закрывать TarDataReader и читат его заново, но это мне кажется вариант "через оПу".
Что мешает произвести расчет на SQL-сервере (например, через хранимую процедуру), а клиенту отдать результат?
Лучшим вариантом здесь будет по-отдельности выбрать и сохранить результаты запросов в какую-нибудь коллекцию (либо воспользоваться DataSet+DataAdapter). А потом уже делать с ними все что угодно.
Я тоже сначала хотел про это написать, а потом подумал, что это только курсорами реализуется. Или курсоры это нормальная практика для таких ситуаций?
Практика-то нормальная, хотя, конечно, в трехзвенной архитектуре лучше такие вещи в серверном приложении производить, а не в СУБД.
Автору. Чтобы произвести расчет нужно иметь связь между тарифами и квартирами, судя по запросам, ее нет совсем. Кроме того очень смущают названия таблиц и полей на русском языке: тебе самому-то удобно набирать их с постоянным переключением раскладки? Особенно впечатлила запись [Идентификатор квартиры], в то время как нормальные люди просто написали бы две буквы - id.