Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
 Аватар для Tleck
7 / 7 / 2
Регистрация: 11.09.2011
Сообщений: 128

Передача нескольких таблиц из БД SQL Server клиенту БД

22.01.2012, 01:16. Показов 6284. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте всем читающим!

Не знал куда больше подойдет этот вопрос C# или SQL Server, так как вероятно существует как минимум 2 решения данного вопроса: непосредственно в servere или на клиенте.

Почему возник этот вопрос: потому что необходимо возвратить пользователю информацию по слову, которое он ввел. Слово может хранится в разных таблицах, поэтому высока вероятность возвращения нескольких таблиц.

Следовательно:
- если есть решение через сервер, то как можно результат запроса передавать не в виде таблицы, а в виде строк?
- если же через клиент, то как в клиенте принят несколько таблиц и корректно их отобразить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2012, 01:16
Ответы с готовыми решениями:

Передача Stream:TStream Клиенту через DataSnap Server
Здравствуйте уважаемые. Столкнулся с проблемой . При запросе клиента к серверу. Выходит такая ошибка. Код Сервера прилагаю

Можно ли имея доступ к SQL Server и зная название базы узнать весь список таблиц и поля этих таблиц в VB.NET?
можно ли имея доступ к SQL Server и зная название базы узнать весь список таблиц и поля этих таблиц в VB.NET P.S. Покажите пойжалуста...

MSQL Server 2000 и обработка нескольких таблиц
Добрый день, всем! ASP и MSQL Server 2000 Пытаюсь сделать SELECT сразу по двум таблицам с разными названиями, но совершенно с...

11
11 / 11 / 0
Регистрация: 16.10.2011
Сообщений: 33
22.01.2012, 09:14
SELECT список полей FROM список таблиц WHERE условия…
Запрос возвращает список строк (одну таблицу), какбЭ.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.01.2012, 10:55
Цитата Сообщение от Tleck Посмотреть сообщение
существует как минимум 2 решения данного вопроса
Данные получить можно 2 способами, через:
- DataReader (возвращает таблицу построчно)
- DataAdapter (возвращает таблицу целиком)
В обоих случаях запрос на получение данных будет одинаковый.

Цитата Сообщение от alex0nik Посмотреть сообщение
SELECT список полей FROM список таблиц WHERE условия…
Такой запрос вернет ерунду при использовании конструкции "...FROM список таблиц..."
Правильность построения запроса зависит от структуры БД и того, в каком виде нужно получить данные. Если запрос должен отобразить данные из связанных таблиц, то нужно строить выборку с использованием Join. Возможно необходимо выбирать данные разными запросами. Все зависит от задач.

Цитата Сообщение от Tleck Посмотреть сообщение
как в клиенте принят несколько таблиц и корректно их отобразить
Несколько таблиц получай используя адаптеры.
Способ отображения выбирать тебе, это зависит от задач, которые решает приложение.
1
 Аватар для Tleck
7 / 7 / 2
Регистрация: 11.09.2011
Сообщений: 128
22.01.2012, 13:58  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
Данные получить можно 2 способами, через:
- DataReader (возвращает таблицу построчно)
- DataAdapter (возвращает таблицу целиком)
В обоих случаях запрос на получение данных будет одинаковый.


Такой запрос вернет ерунду при использовании конструкции "...FROM список таблиц..."
Правильность построения запроса зависит от структуры БД и того, в каком виде нужно получить данные. Если запрос должен отобразить данные из связанных таблиц, то нужно строить выборку с использованием Join. Возможно необходимо выбирать данные разными запросами. Все зависит от задач.


Несколько таблиц получай используя адаптеры.
Способ отображения выбирать тебе, это зависит от задач, которые решает приложение.


Для наглядности и понимания моего вопроса дам уточнение(прошу прощение, что сразе его не написал):
Поиск по БД я сделал с помощью процедуры, используя таблицу таблиц - INFORMATION_SCHEMA и курсор в который занес названия всех таблиц и их столбцов. Перебираются все эти названия таблиц и столбцов в цикле и в случае если результат запроса имеет хотя бы одну строку, выдает результат в виде таблицы. Если слово хранится в нескольких таблица - выдает несколько таблиц.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DECLARE curs CURSOR LOCAL static forward_only FOR
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE DATA_TYPE IN ('nvarchar')
    ORDER BY 1
 
DECLARE @TABLE  nvarchar(MAX),
        @COLUMN nvarchar(MAX),
        @command nvarchar(MAX),
        @commandDo nvarchar(MAX)
        
OPEN curs
WHILE(0=0)
BEGIN
fetch NEXT FROM curs INTO @TABLE, @COLUMN
IF @@FETCH_STATUS<>0 BREAK
 
SET @commandDo = 'SELECT * FROM ' + @TABLE + ' WHERE ' + @COLUMN + ' LIKE ''%' + @search_word +'%'' FOR XML AUTO, TYPE'
SET @command = 'IF EXISTS(SELECT * FROM ' + @TABLE + ' WHERE ' + @COLUMN + ' LIKE ''%' + @search_word + '%'') ' + @commandDo
EXEC(@command)
END
@search_word - искомое слово.

Вот теперь вопрос как же результат, который содержит несколько таблиц занести в одну таблицу и передать адаптеру, или если передавать адаптеру несколько таблиц как он сможет их сформировать в приложении?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.01.2012, 17:19
Цитата Сообщение от Tleck Посмотреть сообщение
как же результат, который содержит несколько таблиц занести в одну таблицу
Можно использовать объединение по UNION, но при этом выходной набор столбцов должен быть одинаковым. Все данные вернуться в виде одной объединенной таблицы.
Либо нужно менять логику.
Как я понимаю это что-то типа глобального поиска по БД. Может сделать так, что некая процедура ищет слово и возвращает список таблиц, в которых оно было найдено. А приложение на основании этого списка выбирает каждую таблицу по-отдельности. Отображение каждой полученной таблицы можно сделать в динамически создаваемых DataGridView.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
22.01.2012, 22:48
Можно сделать так:
1. Разработать таблицу универсальной структуры, в которую можно было бы записывать результаты поиска (я имею ввиду не временную таблицу);
2. Результаты работы курсора я бы записывал в эту таблицу
3. Добавил бы интерфейс позволяющий отображать условия поиска и вводить условия поиска (параметры хранимой процедуры).

Таким образом работа по поиску будет выполняться на более низком уровне, а вывод данных будет без всяких заморочек стандартно осуществляться на стороне клиента.

Хотя есть еще вариант использования той же хранимой процедуры, которая бы возвращала результаты в виде таблицы (никогда такого не делал), но мне лично такой способ нравится меньше.
1
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.01.2012, 23:38
_katon_, практически согласен с тобой, мне тоже не совсем понятно, зачем выводить всю таблицу, если в ней нашлось всего одно слово, но видимо у ТС есть на это причины.
0
 Аватар для Tleck
7 / 7 / 2
Регистрация: 11.09.2011
Сообщений: 128
22.01.2012, 23:40  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
_katon_, практически согласен с тобой, мне тоже не совсем понятно, зачем выводить всю таблицу, если в ней нашлось всего одно слово, но видимо у ТС есть на это причины.
Я вывожу xml код таблиц - его в клиенте можно считать одной строкой. У меня теперь проблема другая. Считавется первая таблица, а остальные не считываются
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
23.01.2012, 00:11
А это потому что у тебя проблемы с курсором. если MS SQL Server-2008 то можно воспользоваться режимом отладки и посмотреть что происходит в коде хранимой процедуры. А вообще на вот держи пример курсора... не на что не претендую... так в нагрузку:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE  PROC АннулированиеНеоплаченныхЗаказов 
As
DECLARE @КодЗаказа int
DECLARE curКодыЗаказов CURSOR LOCAL STATIC
FOR
       SELECT ЗаказID FROM Заказы
       WHERE Состояние = ‘оформление’ AND 
       DATEDIFF(day, ДатаЗаказа, Getdate()) >10 
OPEN curКодыЗаказов 
FETCH NEXT FROM curКодыЗаказов INTO @КодЗаказа 
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC АннулированиеЗаказа @КодЗаказа 
    FETCH NEXT FROM curКодыЗаказов INTO @КодЗаказа 
END
CLOSE curКодыЗаказов 
DEALLOCATE curКодыЗаказов
0
 Аватар для Tleck
7 / 7 / 2
Регистрация: 11.09.2011
Сообщений: 128
23.01.2012, 00:15  [ТС]
Цитата Сообщение от _katon_ Посмотреть сообщение
А это потому что у тебя проблемы с курсором. если MS SQL Server-2008 то можно воспользоваться режимом отладки и посмотреть что происходит в коде хранимой процедуры. А вообще на вот держи пример курсора... не на что не претендую... так в нагрузку:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE  PROC АннулированиеНеоплаченныхЗаказов 
As
DECLARE @КодЗаказа int
DECLARE curКодыЗаказов CURSOR LOCAL STATIC
FOR
       SELECT ЗаказID FROM Заказы
       WHERE Состояние = ‘оформление’ AND 
       DATEDIFF(day, ДатаЗаказа, Getdate()) >10 
OPEN curКодыЗаказов 
FETCH NEXT FROM curКодыЗаказов INTO @КодЗаказа 
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC АннулированиеЗаказа @КодЗаказа 
    FETCH NEXT FROM curКодыЗаказов INTO @КодЗаказа 
END
CLOSE curКодыЗаказов 
DEALLOCATE curКодыЗаказов
Когда запускаю процедуру в sql server выдает информацию верно, так что с курсором все норм. Дело в том что процедура выдает таблицы отдельными блоками, а в клиенте комманда читает только первый.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
23.01.2012, 00:31
Упс. ну курсор все равно отключи как надо (хороший тон ). А как вызывается процедура? Ее можно вызывать 3-я способами:
1. Не возвращает значения;
2. Возвращает скалярное значение;
3. Возвращает данные в табличном виде;

Для последнего всегда пользовался функциями, поэтому не знаю как вернуть с помощью ХП таблицу.

Если у тебя возвращается процедурой только одна строка, то скорее всего клиент понимает только один запрос выполненный в процедуре (первый). Поэтому можно и дажне наверное будет правильнее сделать табличную переменную TABLE засунуть туда в цикле нужные данные, а уж потом сделать один EXEC(@command).
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
23.01.2012, 10:17
Цитата Сообщение от _katon_ Посмотреть сообщение
не знаю как вернуть с помощью ХП таблицу.
Процедура заканчивается запросом SELECT, который возвращает таблицу
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2012, 10:17
Помогаю со студенческими работами здесь

SQL выборка из нескольких таблиц
Существует 2 таблицы, &quot;result&quot; и &quot;sportsman&quot;, заполненные посредством &quot;INSERT INTO&quot;. Необходимо Вычислить возраст спортсменов, которые...

[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection
Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection Вот такую ошибку выдает. В DSN...

Создания таблиц в SQL Server
Создаю я таблицу при помощи Visual Studio во таким кодом String str; SqlConnection myConn = new...

Удаление нескольких таблиц в SQL базе
Доброго времени суток господа. Столкнулся с задачей удалить несколько таблиц в SQL базе. Данные по именам таблиц в базу отправляю в XML....

Запрос sql по поиску из нескольких таблиц
Добрый день. Помогите пожалуйста понять, могу ли я сделать так или нужно переделать базу или такой поиск не возможно реализовать. Пишу на...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru