Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Frustrator
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
1

Пересечение нескольких таблиц

30.11.2011, 05:42. Просмотров 1280. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Пробую организовать поиск текста в файлах. По одному слову, сделал:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 public void GetFilesFromWord(string dbname, string word)
        {
            global.dtFsrez.Clear();  global.dtwordscrosstable.Clear();//Таблицы используемые как временные и для datagridview
 
            string CS = @"Data Source=" + setup.AppDir + @"Data\" + dbname + ".sdf;Persist Security Info=False;";
            SqlCeConnection con = new SqlCeConnection(CS);
            string sql = "Select Word, Type, ID from Dictionary where Word LIKE '" + word + "'";
            SqlCeCommand com = new SqlCeCommand(sql, con);
            SqlCeDataAdapter da = new SqlCeDataAdapter();
 
            DataTable tmp = global.dtdictionary.Copy(); tmp.Clear();
            try
            {
                da.SelectCommand = com;
                da.Fill(tmp);
            }
            catch (Exception ex)
            {
                MessageBox.Show("GetFilesFromWord-1\n" + ex.ToString() + "\nСодержимое запроса\n\n" + sql);
            }
     
            
            //для каждого найденого слова смотрю пересечения
            for (int i = 0; i < tmp.Rows.Count; i++)
            {
 
                sql = "Select * from WordsCrossTable where Word_ID = '" + tmp.Rows[i]["ID"] + "'";
                SqlCeCommand com2 = new SqlCeCommand(sql, con);
                SqlCeDataAdapter da2 = new SqlCeDataAdapter();
                try
                {
                    da2.SelectCommand = com2;
                    da2.Fill(global.dtwordscrosstable);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("GetFilesFromWord-2\n" + ex.ToString() + "\nСодержимое запроса\n\n" + sql);
                }
 
            }
            
            //для каждого пересечения вывожу файлы
            for (int i = 0; i < global.dtwordscrosstable.Rows.Count; i++)
            {
                sql = "Select folders.Dir, " +
                              "files.Name, " +
                              "files.Extension, " +
                              "files.Size, " +
                              "files.CreationTime, " +
                              "files.LastAccessTime, " +
                              "files.LastWriteTime, " +
                              "files.ReadOnly, " +
                              "files.Hidden, " +
                              "files.Encrypted " +
                               " from files , folders where files.dir_id = folders.id and "+ 
                               " files.ID = '"+ global.dtwordscrosstable.Rows[i]["File_ID"].ToString()+"'" ;
                SqlCeCommand cm = new SqlCeCommand(sql, con);
                SqlCeDataAdapter da2 = new SqlCeDataAdapter();
               try
                {
                    da2.SelectCommand = cm;
                    da2.Fill(global.dtFsrez);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("GetFilesFromWord вторая часть\n" + ex.ToString() + "\nСодержимое запроса\n\n" + sql);
                }
 
 
            }
        }
А как выполнить поиск по строке из слов?
Я разделяю текст и через foreach начинаю цикл:

C#
1
2
3
4
5
   string[] words = seachstr.Split(global.delimiterChars);
         
            foreach (string s in words)
            {
                ...//Примерно тоже, что и при поиске одного слова
Если текст "раз два три". То должно получится пересечение 3х таблиц.
Как мне это реализовать?
Я предполагаю, что нужно:
-создать таблицу файлов в памяти
-занести туда список всех файлов
-в foreach делать пересечение таблиц

но не догоняю как реализовать это программно, чувствую, что LINQ помог бы,
но я до него еще не дорос(.
Подскажите, пожалуйста, советом, как организовать указанный поиск текста...
В приложении ER-моделька и скрин программы с поиском слова, для наглядности...
0
Миниатюры
Пересечение нескольких таблиц   Пересечение нескольких таблиц  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 05:42
Ответы с готовыми решениями:

Пересечение таблиц
В программировании совсем новичок, цель задачи заключается вот в чем. Программа должна брать 2...

Отображение нескольких таблиц в нескольких dataGridView
Доброго всем времени суток, пишу программу на C# которая работает с БД access 2007. БД состоит из...

Выборка из нескольких таблиц
Здравствуйте, в задании курсача стоит такой пункт: сделать выборку некоторых столбцов из таблицы,...

Выборка из нескольких таблиц
Здравствуйте! Столкнулся с непониманием, как составить запрос для выборки данных из нескольких...

Отчет из нескольких таблиц
Извините, а как вытащить отчет из нескольких взаимосвязанных таблиц? Я могу вытащить отчет только...

3
Winsor
331 / 267 / 18
Регистрация: 19.01.2011
Сообщений: 597
30.11.2011, 19:46 2
Насколько я понял задачу - необходимо вывести все файлы из "Файл", в которых находиться слово word из "Словарь", причем одному вхождению word может соответствовать несколько строк из "Файл" и эти соответствия хранятся в "Кросс таблица"? Если да - то это можно сделать одним запросом к базе данных. И при поиске по нескольким словам - можно строить этот же запрос с несколькими LIKE условиями.
0
Frustrator
7 / 7 / 0
Регистрация: 25.05.2010
Сообщений: 38
30.11.2011, 19:56  [ТС] 3
Цитата Сообщение от Winsor Посмотреть сообщение
Насколько я понял задачу - необходимо вывести все файлы из "Файл", в которых находиться слово word из "Словарь", причем одному вхождению word может соответствовать несколько строк из "Файл" и эти соответствия хранятся в "Кросс таблица"? Если да - то это можно сделать одним запросом к базе данных. И при поиске по нескольким словам - можно строить этот же запрос с несколькими LIKE условиями.
Все верно.
А если заранее не известно количество слов в строке поиска?
тогда не представляю как одним запросом, - это нечто нереальное (конструкция внутри конструкции))...

Будьте добры, примерно, набросайте реализацию...
0
Winsor
331 / 267 / 18
Регистрация: 19.01.2011
Сообщений: 597
01.12.2011, 10:13 4
Запрос внутри запроса - это не то. Это ОДИН запрос. Пришлите Вашу базу - сделаю запрос. По поводу многих слов - все проще чем Вы думаете. написать генератор LIKE выражения - это легко
0
01.12.2011, 10:13
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 10:13

Выборка из нескольких таблиц
подскажите как правильно осуществить запрос...? есть несколько таблиц таблица 1:...

Вывод информации из нескольких таблиц
string strConn, strSQl; strSQl = &quot;SELECT , , , , , , , , , , , FROM Student JOIN...

Выбор данных из нескольких таблиц
Ребят, выручайте, 2й день не могу понять, что не так. Есть несколько связанных таблиц, надо вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.