|
Вопрос # 4 459/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Подскажите можно ли и если да, то как, в delphi работать со временными таблицами MSSQL? Конкретнее:
Скажем результат запроса (ADOQuery) отображается в DBGrid, хочу выбирая в произвольном порядке записи (например кликом на соответсвующей строчке Грида) помещать их во временную таблицу, ну скажем как выбранные, что бы в дальнейшем использовать в другом запросе, а параллельно и видеть в другом гриде связанном с этой временной таблицей... Вариант с глобальной временной таблицей проходит, но и с другого экземпляра программы (на другом компе) вижу, естественно тоже самое, а хотелось бы, что бы каждый пользователь работал со своим набором данных. Как только создаю таблицу просто временной она становиться не видимой для других компонентов, хранимых процедур и прочего... не смотря на то, что соединение (ADOConnection) используется одно и то же.
Вариант типа экспортировать все к себе в локальную базу не хочу. Интересует именно работа с одним Сервером MS SQL без создания дополнительных источников данных.
 |
Вопрос задал: Mike (статус: Посетитель)
Вопрос отправлен: 26 июля 2010, 13:13
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Mike!
а кто мешает создавать таблицы с уникальными именами? то есть имя таблицы имеет вид
username_tmp1
username_tmp2
....
первая половинка - это имя пользователя, вторая - собственно имя таблицы.
теперь для каждого пользователя будет легко взять его таблицы, подчистить если что...
Понятно, что в качестве username может выступать некий уникальный идентификатор - например просто id, присваиваемый при старте клиента или ещё что нибудь. Очень хорошо сюда могут вписаться GUID'ы, если пользователи хотят быть анонимными.
Если пользователей не так много, то можно сделать по другому. Таблица одна на всех, но в ней ещё есть поле ID_USER и таким образом записи отбираются для заданного пользователя. Но этот способом может иметь проблемы с производительностью.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 июля 2010, 13:44
Оценка за ответ: 5
Комментарий к оценке: Спасибо! Железобетонность моего мышления.
Зациклился на временных. Конечно так и надо сделать.
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 27 июля 2010, 09:12; участников в обсуждении: 4.
|
Тов. Женька (статус: 3-ий класс), 26 июля 2010, 13:29 [#1]:
С MSSQL я рабтал мало да и под рукой его нет. Но могу предположить, что можно.
http://www.sqlbooks.ru/readarticle.aspx?part=02&file=tsql16
Чтобы таблица не была видна с другой машины, других вариантов, кроме локальной, я не вижу. С другой стороны, может быть, возможно задавать права на доступ к этой таблице для каждого пользователя, чтобы кому нельзя, не лазал.
Я не знаю какого рода программа у вас. Но обычно, если это не менеджер БД, пользователи видят только данные, не зная при этом откуда они взяты. Так что создавайте локальные переменные в программах, обзывайте значениями из них временные таблицы и используйте.
|
|
Ерёмин А.А. (статус: *Администратор), 26 июля 2010, 14:12 [#2]:
Как правило, временные таблицы действуют для текущего соединения. Странно, что в вашем случае это не работает...
|
|
Mike (статус: Посетитель), 26 июля 2010, 15:24 [#3]:
То Ерёмин
вот я так же и думал... в случае с Query Analyzer так и происходит. Устанавливается соединение - в нем создаешь временную таблицу, а потом можешь менять текст обращаться к этой таблице, писать в нее и она будет доступна, а из другого соединения - нет.
А в программе получается, что даже, если в одном же ADOQuery я эту таблицу создаю (если была не создана), в нем же пишу в нее, или удаляю в зависимости от параметров (Parameters), то все равно она каждый раз создается заново (т.е после создания и добавления например записи, в следующий раз она снова создается и добавляется уже другая, но 1 запись... предыдущая бесследно исчезает - ну или точнее пропадает вместе со временной таблицей) - вот я и подумал - что не так делаю, где подвох?
|
|
Mike (статус: Посетитель), 26 июля 2010, 15:27 [#4]:
может подвох в работе с ADOQUERY ?
Я каждый раз, что бы заставить его отработать делаю ADOQuery.Close;
ADOQuery.Open;
Может нужно по другому запускать на исполнение, например ADOQuery.Active := False;
ADOQuery.Active := True;
сейчас сам и проверю...
|
|
Mike (статус: Посетитель), 26 июля 2010, 15:58 [#5]:
нет... это тоже не влияет
|
|
Вадим К (статус: Академик), 26 июля 2010, 16:02 [#6]:
active=false это равносильно close.
Не нужно закрывать query
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Mike (статус: Посетитель), 26 июля 2010, 16:42 [#7]:
To Вадим К
так а как мне заставить запрос обновиться?
ADOQuery.Requery сообщает, что не возможно применить на закрытом объекте.... Хотя не понятно кто его закрывал
видимо, я не совсем понимаю механизм работы ADOQUERY...
|
|
Тов. Женька (статус: 3-ий класс), 26 июля 2010, 18:13 [#8]:
Так не используй запрос.
|
|
Mike (статус: Посетитель), 27 июля 2010, 09:12 [#9]:
О как!
А что это изменит?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|