Выборка данных из нескольких таблиц. - C#
Формулировка задачи:
Делаю курсовую работу на C#, столкнулся с необходимостью организовать поиск по нескольким таблицам базы данных, с которой работаю.
Организовать SQL запрос SELECT вроде как получилось, запрос формируется в виде строки в зависимости от заполненных полей ввода в поиске. Но при обработке запроса происходит дублирование полученных данных.Сейчас приведу код, которым делаю то что мне необходимо, и в общем-то хотелось бы услышать ваши рекомендации, как избавиться от декартового произведения в запросе.
//Открытие соединения с БД con.Open(); //Счетчик найденых совпадений count = 1; //Создание строки запроса.Самое сложное в процессе Поиска string query = "Select * from [Persona],[Info_o_meste],[Pers_Charact] WHERE ([Persona].[ID]=[Info_o_meste].[ID] AND "; //В случае заполненности полей добавляю в строку запроса соответствующие поля if (name_box.Text != "") { query += "[Persona].[Imya] Like '%" + name_box.Text + "%'"; query += " AND "; } if (fam_box.Text != "") { query += "[Persona].[Familiya] Like '%" + fam_box.Text + "%'"; query += " AND "; } if (fat_name.Text != "") { query += "[Persona].[Ot4estvo] Like '%" + fat_name.Text + "%'"; query += " AND "; } if (sel_sex.ToString() != "") { query += "[Persona].[Pol] = '" + s_pol + "'"; query += " AND "; } if (strana.Text != "") { query += "[Info_o_Meste].[Strana] Like '%" + strana.Text + "%'"; query += " AND "; } if (gorod.Text != "") { query += "[Info_o_Meste].[Gorod] Like '%" + gorod.Text + "%'"; query += " AND "; } if (Smoke.SelectedText != "") { query += "[Pers_Charact].[Smoking] = '" + Smoke.Text + "'"; query += " AND "; } if (Alcohol.SelectedText != "") { query += "[Pers_Charact].[Alcohol] = '" + Alcohol.Text + "'"; query += " AND "; } if (rost.Text != "") { query += "[Pers_Charact].[Rost] = '" + rost.Text + "'"; query += " AND "; } if (ves.Text != "") { query += "[Pers_Charact].[Ves] = '" + ves.Text + "'"; query += " AND "; } if (temper.Text != "") { query += "[Pers_Charact].[Temperament] = '" + temper.Text + "'"; query += " AND "; } //Удаляю последний AND (да, быдло-код, но результат меня удовлетворяет. query = query.Remove(query.Length - 5, 5); //Добавляю в строку запроса закрывающую скобку. query += ")"; //РичТекстБокс, в который вывожу строку получившегося запроса, так, для себя, для проверки, так сказать.Работает нормально. qwe.Text = query; //Создание запроса OleDbCommand comand = new OleDbCommand(query, con); //Создание ридера к запросу OleDbDataReader reader = comand.ExecuteReader(); //Начало работы с результатом запроса reader.Read(); //В случае, если ридер пустой (т.е полученых данных нет) if (reader.HasRows == false) { count = 1; MessageBox.Show("Пользователей по данному запросу не обнаружено!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information); reader.Close(); } else { //Считаю количество найденных совпадений для создания массива ID номеров подходящих по запросу данных while (reader.Read()) { count++; } //Указание массиву ID адресов размера arr = new int[count]; reader.Close(); } //Создание нового ридера. OleDbDataReader reader1 = comand.ExecuteReader(); //Очистка комбобокса, в котором хранятся результаты работы запроса (Ф.И.О клиентов, подходящих по указанным данным в запросе) sovp.Items.Clear(); int i = 0; while (reader1.Read()) { //Заполнение массива ID адресов ID адресами ( reader[0] ) arr[i] = int.Parse(reader1[0].ToString()); i++; //Создание строки заносимой в комбобокс , имеет вид (Фамилия Имя Очество) string it = reader1[2].ToString() + " " + reader1[1].ToString() + " " + reader1[3].ToString(); //Добавление строки комбобокс sovp.Items.Add(it); } //Закрытие ридера и соединения. reader.Close(); con.Close();
Решение задачи: «Выборка данных из нескольких таблиц.»
textual
Листинг программы
SELECT * FROM table1 WHERE (column1=@param1) AND (column2 LIKE @param2)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д