Выборка данных из нескольких таблиц. - 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)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы