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