Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > поиск в базе по заданным критериям


Автор: kizune 19.11.2007, 14:29
Привет,всем.
Такой вопрос новичка.

как осуществить такую логику:
юзер вводит данные code и phone нажимает search
идем в table1 ищем соответствия:
а. есть соответствия - берем codeId - идем в таблицу table2 находим там codeId и areaId - вытаскиваем соответственные данные Phone, Fax - отображаем на странице
б. нет соответствий - вывод сообщения "ничего не найдено"
 
или где можно почитать про осуществление подобной логики с примерами

спасибо



Автор: thomas 19.11.2007, 15:52
kizune, 
Приветствую.
Для начала не плохо бы знать какие поля содержит таблица1 и таблица2. А так же как они связаны.
Потом что означает в этой фразе
Цитата

юзер вводит данные code и phone нажимает search

слово code?
Потом если вы ищете запись по codeId и собираетесь на её основании получить phone и fax из второй таблицы, то зачем вводить на равне с code еще и phone?

Цитата

где можно почитать про осуществление подобной логики с примерами

Любую книжку по нормализации данных и рассказывающую об SQL.
Вам надо знать как спроектировать БД и получать из нее данные посредством SQL-запросов.

В принципе всё.

Да, и что бы всем этим рулить из VS необходимо знать ADO.NET.

Успехов.  smile 

Автор: alik_voodoo 19.11.2007, 17:46
Тебе не сюда, тебе в SQL форумы, ищи инфу по inner join.

Автор: kizune 20.11.2007, 12:47
thomas,
Цитата

Потом что означает в этой фразе
Цитата

юзер вводит данные code и phone нажимает search

слово code?

это такое же значение как и phone.

Цитата

Потом если вы ищете запись по codeId и собираетесь на её основании получить phone и fax из второй таблицы, то зачем вводить на равне с code еще и phone?

здесь я неправильно выразилась.допустим надо получить не просто phone, а к примеру - LocalPhone

alik_voodoo,спасибо,буду искать

еще вопрос вот например я ввожу в текстовое поле id='tbPhone'  какое-то значение например 378945,нажимаю кнопку search:


Код

private void bnSearch_Click(object sender, EventArgs e)
    {
        String strConnect;
        String strCommand;
        SqlConnection conn;
        SqlCommand cmd;
        conn = new SqlConnection("server=localhost;database=db; uid=sa; pwd=open");
        conn.Open();
        strCommand = "SELECT Phone FROM table1";
        cmd = new SqlCommand(strCommand, conn);
         
       
    }  


 как быть дальше в смысле проверить есть ли там такое значение или нет?

спасибо

Автор: thomas 20.11.2007, 16:01
kizune, 
Повторюсь 
Цитата
Для начала не плохо бы знать какие поля содержит таблица1 и таблица2. А так же как они связаны.

Этот ответ 
Цитата
это такое же значение как и phone.
 еще боьше запутал ситуацию. Потому как далее по тексту появилось LocalPhone.
Далее 
Цитата
я ввожу в текстовое поле id='tbPhone'  какое-то значение например 378945,нажимаю кнопку search: ... как быть дальше в смысле проверить есть ли там такое значение или нет? 
 Если вы изначально знаете ID, то оно конечно там есть. Но если вы вводите ID "от балды", то в чем смысл?

Попробуйте словами описать что должна делать программа. И покажите как организовано хранение данных(см. первую цитату). Тогда можно будет ответить что и как. А так ... , я же не экстрасенс. 

А проверить существует запись в таблице или нет можно выполнив следующий запрос
Код

SELECT Count(*) AS total FROM tblMyTable WHERE phone = '555-22-33'

подставив его в метод cmd.ExecuteScalar примерно так
Код

public object DoScalar(string sql)
        {
            object oRes = null;

            try
            {
                dbCmd.CommandText = sql;
                dbCmd.CommandType = CommandType.Text;
                dbCon.Open();
                oRes = dbCmd.ExecuteScalar();
            }
            catch (Exception Ex)
            {
                System.Windows.Forms.MessageBox.Show("Fout SqlDB.doScalar " + sql + ": " + Ex.Message);
            }
            //finally
            {
                dbCon.Close();
                return oRes;
            }
        }

Функция возвратит значение подсчета строк отвечающих данному условию. Соответственно, если вернет "0", то такого телефона нет, если вернет "1" или более значит есть.


Автор: kizune 20.11.2007, 16:29
Цитата

Для начала не плохо бы знать какие поля содержит таблица1 и таблица2. А так же как они связаны.


таблица1 содержит:

codeId, code, phone
(при поиске соответствий сначала ищем по двум параметрам code, phone.если точных соответствий не найдено ищем только по code)

таблица2 содержит:

codeId, areaId, LocalPhone, Fax

связаны таблицы через codeId





Автор: thomas 20.11.2007, 16:53
kizune, 
если я правильно понял, то имеем следующее:
таблица1
CodeId - PK
code
phone

таблица2
areaId - PK - ???
codeId - FK
LocalPhone
Fax

 
Цитата

при поиске соответствий сначала ищем по двум параметрам code, phone.если точных соответствий не найдено ищем только по code

code - это что код страны?
phone  - номер телефона?

Какая задача стоит? До сих пор не понятно. Ходим вокруг да около.
Неужели сложно написать что-то типа:
имееются клиенты, данные(ФИО, адрес, бла бла) о них храняться в таблице1;
имются контактные лица, данные о них храняться в таблице2.
Необходимо для заданного клиента найти контактное лицо и получить его данные из БД.

На данный момент меня терзают сомнения что у вас не правильно организовано хранение данных.
В чем разница между phone и localphone?

Для поиска каких либо данных в таблице БД используются оператор условия WHERE в sql-запросе. Если есть значение удовлетворяющее условию он его вернет.

Добавлено через 3 минуты и 7 секунд
Для фильтрации данных в таблице ДатаСет, которые нужно отобразить существует обьект DataView с методом RowFilter

Автор: kizune 20.11.2007, 17:20
извини,если неправильно выражаюсь
Цитата

таблица1
CodeId - PK
code
phone

таблица2
areaId - PK - ???
codeId - FK
LocalPhone
Fax


таблица2 codeId - PK

Цитата

code - это что код страны?
phone  - номер телефона?


code - код региона страны
phone - номер телефона

в результате поиска необходимо вывести на страницу LocalPhone и Fax контактного лица организации.phone - номер телефона организации LocalPhone - номер телефона контактного лица.

таблица1
сodeId - идентификатор кода региона
code - код региона
phone - телефон организации

таблица2
areaId - идентификатор названия региона
codeId - идентификатор кода региона
LocalPhone - телефон контактного лица
Fax - контактного лица

необходимо по заданному коду региона и телефону найти телефон и факс контактного лица

Автор: thomas 20.11.2007, 17:32
kizune, 
Подожди немного, сейчас сделаем.  smile 

Так для начала вот примерно так должна выглядеть схема БД.
user posted image
Таблицы связаны "один-ко многим".
В регионе может быть несколько организаций.
У организации может быть несколько контактных лиц.

А что бы получить ответ на этот вопрос
Цитата

необходимо по заданному коду региона и телефону найти телефон и факс контактного лица

пишем такой sql-запрос к БД
Код

SELECT КонтактноеЛицо.Телефон, КонтактноеЛицо.Факс
FROM Регион INNER JOIN (Организация INNER JOIN КонтактноеЛицо ON Организация.ОрганизацияID = КонтактноеЛицо.ОрганизацияID) ON Регион.РегионID = Организация.РегионID
WHERE (((Организация.Телефон)=[?]) AND ((Регион.НазваниеРегиона)=[?]));


По названию региона и по телефону организации (в этом регионе) получаем телефон и факс контактного лица (в этой организации) 
Если оно(лицо) есть.  smile 

ЗЫ 
    
kizune, 
 я отлучусь не надолго. Есть вопросы пиши.  smile 


Автор: kizune 20.11.2007, 18:22
благодарю за разъяснение smile 
только мне нужно сделать этот запрос через
SqlConnection, SqlCommand итд на c#.поэтому я в растерянности
 

Автор: thomas 20.11.2007, 23:25
kizune, 
Цитата

мне нужно сделать ... на c#.поэтому я в растерянности

Вот что бы избавить вас от растерянности, соорудил примерчик с БД.
Коментариев достаточно, думаю поймете.

Да, БД сделал не серверную извините.Но принципиальной разницы нет. Провайдера поменяете и OleDb на Sql.
Чтобы посмотреть как работает отредактируйте путь к базе в connectionString.

Успехов.

Автор: kizune 21.11.2007, 10:38
большое спасибо smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)