|
|
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Насколько я понял. Последовательность следующая: При запуске клиента, он подключается к dll. Далее при обновлении данных в таблице срабатывает триггер, происходит подключение к dll, в dll генерируется событие, на которое реагирует клиент и запускает Recordset. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2008, 21:24 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Что такое BOL не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2008, 21:50 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Тогда советую вам узнать, это B ooks O n L ine — справочная система MSSQL. Берите и читайте. Для 2005 версии есть даже на русском языке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2008, 22:01 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Читал. В частности сегодня все что нашел по ADO - пересмотрел. Но так и не понял как с помощью Recordset добавить только недавно поступленные данные либо выявить, грубо говоря, из 100 полей только то одно которое обновилось. Ну а по поводу отслеживания изменения в базе данных на этом форуме опытные программисты очень много вели дискуссии. я же не претендую на звание программиста, можно просто направить на раздел или статью где это описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2008, 22:12 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
В BOL нужно почитать про sp_OACreate и sp_OAMethod. Та последовательность, что вы описали, будет работать только если клиент и сервер находятся на одном компьютере. Я говорил о другом. Клиент не подключается к dll. dll ставится на сервер. При срабатывании триггера dll не генерит событие, а отправляет пакет по сети, на определенный ip или имя компьютера или на несколько компьютеров. На заранее определенный порт. Клиент постоянно слушает этот порт, когда на него приходят данные, реагирует. Отправка и прием данных по сети делается с помощью Microsoft Winsock Control. В четвертый раз я это повторять уже не буду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 10:26 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Спасибо. В моем случае клиент и сервер на одном компьютере. Возможно в будующем появится необходимость в удаленном уведомлении. Единственное хотелось бы знать насколько высокая будет производительность в обоих случаях. Если данные обновляются несколько раз в секунду насколько быстро будут поступать обновленные данные в клиент на одном компьютере и через сеть? И вообще возможны ли потери некоторых данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 10:47 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Если данные обновляются раз в секунду, то система будет в основном занята перегоном данных между клиентом и сервером, работать на ней будет нереально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 12:05 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
* несколько раз в секунду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 12:06 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Не могли бы привести пример какого-нибудь события в dll, на которое будет реагировать клиент? Т.е. клиент постоянно должен быть в ожидании этого события? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 21:20 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
И насколько я понимаю это событие можно напрямую вызвать из MS SQL? Или оно должно наступать при обращении к dll? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 21:22 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
proftsНе могли бы привести пример какого-нибудь события в dll, на которое будет реагировать клиент?О господи! Не бывает событий в dll. Событие случается в твоей базе данных - добавилась строка например. На таблице висит триггер. Этот триггер отследив что произошло добавление строки обращается к функции которая находится во внешней dll. В качестве параметра для этой функции передает список всех подключенных к базе в данную секунду клиентов и их IP адреса. Функция проходит по всему списку клиентов, устанавливает с каждым клиентом TCP туннель и посылает по нему сообщение "такая-то таблица обновилась". (Если не хочешь с TCP туннелем возится, можешь ограничиться UDP пакетами, но они имеют право теряться. Подробнее читай учебник по сетям) proftsТ.е. клиент постоянно должен быть в ожидании этого события?Да. Каждый клиент базы данных все это время сидит и ждет пока та самая функция из dll не попытается с ним связаться. А когда она связалась и сообщила что какая-то таблица обновилась, клиент должен будет посмотреть: а показывает ли он в данное время эту таблицу вообще или пользователь держит открытым другое окно. А потом из того-то же информационного пакета в котором приехало имя таблицы, клиент вытащит первичные ключи обновленных записей, и перезапросит эти записи с сервера. Потом добавит/удалит/изменит эти записи на визуальном отображении таблицы. После чего клиент заснет в ожидании следующей посылки по уже установленному каналу связи либо открытия нового канала. И если ты еще не догадался - этот канал связи по которому сервер сообщает клиенту о появлении новых записей это совсем не тот же самый канал связи по которому клиент тянет данные с сервера. У тебя будет в итоге два канала. Один для данных, другой для событий на сервере. Теперь понял? Или еще дальше разжевывать? И сразу говорю - ни один DBGrid самостоятельно это все делать не умеет. И наборы компонентов которые умеют так работать стоят очень и очень большие деньги. proftsИ насколько я понимаю это событие можно напрямую вызвать из MS SQL? Или оно должно наступать при обращении к dll?Ты никогда сам события не вызываешь. Вообще. На то они и события. События случаются и они уже вызывают твои функции и процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 22:43 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
По поводу события не так выразился. В голове понимаю о чем хочу спросить, а терминологию практически не знаю. А по поводу DBGrid и набора компонентов на самом деле слышу первый раз. Вообще изначально думал, что такая задача как обновление данных в клиенте - абсолютно обычная и простая задача, описание которой должно быть чуть ли не в первой главе каждого учебника. Как мне казалось что база данных для того и создается, чтобы в любое время можно было легко воспользоваться ее данными. К тому же занялся этим вопросом после того как один из знакомых проделал тоже самое на Oracle и особых проблем у него с этим не возникло. (знакомый может громко сказано в том плане, что просто так делиться своими наработками он ни с кем не будет, в том числе со мной). Тогда вообще не понимаю где камень преткновения и что в данном случае будет стоить очень и очень большие деньги. Как же другие это делают. Как пример на этом же форуме есть другая тема с такой же задачей. Там ее решили через блокировку таблицы (например) на сервере, триггер обравает блокировку, а клиент находится в ожидании обрыва. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 00:11 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
proftsВообще изначально думал, что такая задача как обновление данных в клиенте - абсолютно обычная и простая задача, описание которой должно быть чуть ли не в первой главе каждого учебника.Ну не знаю насчет учебников, но задача в обычной постановке действительно очень простая: Код: plaintext 1. 2. 3. 4. А если задача ставится так, чтобы сервер сообщал клиенту что данные обновились - вот тогда начинаются игры с дополнительными каналами связи. Читай выше. proftsТогда вообще не понимаю где камень преткновения и что в данном случае будет стоить очень и очень большие деньги.если знаешь что и как - никаких камней :) Но чтобы это реально сделать тебе нужно быть одновременно и специалистом в базах данных (чтобы написать триггер) и специалистом в твоей конкретной СУБД (иначе не сможешь связать триггер с внешней dll) и уметь посылать сообщения по сети (чтобы написать эту самую dll) и уметь принимать эти сообщения... То есть это либо один универсал (а мы дорогие) Либо команда из нескольких человек. proftsКак же другие это делают. Как пример на этом же форуме есть другая тема с такой же задачей. Там ее решили через блокировку таблицы (например) на сервере, триггер обравает блокировку, а клиент находится в ожидании обрыва.Ну а как именно клиент ждет обрыва этой самой блокировки? Механизм ожидания там какой? И вообще, о какой блокировке в том топике шла речь? Если о транзакционных блокировках, то они триггером не обрываются в принципе и клиент ждет ответа всегда автоматически. Если самодельные блокировки подвластные триггерам - то опять вопрос: как клиент узнает что блокировка снялась? Тут только два пути - либо перезапрашивать постоянно, либо изобретать свою реализацию server push. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 00:46 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
По поводу блокировки: Так вот, создаем заблокированный ресурс - ну собственно как угодно, да хоть вот так: begin transaction one select * from link with (holdlock) waitfor delay '00:01:00' commit Ну ясный пень, я таблу взял просто для демонстрации, фактически можно работать даже без таблы, а просто по именованной транзакции. Но это более сложная техника, я ее тут не буду описывать. После создания заблокированного ресурса - наслаждаемся списком заблокированных ресурсов: exec sp_lock и наконец, АСИНХРОННО из клиента выдаем: Insert link default values Ну, на самом деле, конечно, в зависимости от установок может потребоваться Insert link with (holdlock) default values - я думаю, вы понимаете это и я не заостряю на этом внимание. Так вот, эта последняя команда благополучно виснет, до того момента, пока первая транзакция не завершится и ресурс не освободится. Когда ресурс освободится, то - подчеркиваю - и в ADO и в ADO.NET - возникает событие завершения этой асинхронной команды. Которое, собственно говоря и есть наше оповещение клиента о событиях сервера. Техника освобождения ресурсов стандартная - их множество разных - это не суть вопроса. Логика подписки реализуется в данных таблы link, которая собственно и возвращается клиенту после возникновения события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 08:09 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
При работе с триггерами эта схема применима только с использованием именованной транзакции. А вот интересно стало, какую задачу вы хотите решить с этими уведомлениями? Может эта возня имеет смысла не больше, чем попытка прикрутить к велосипеду ласты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 10:31 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
я на это уже намекал автору. похоже, что он с того конца копает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:00 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Задача следующая. В MS SQL поставляются котировки ценных бумаг в реальном времени и накапливается история по ним. Допустим таблица с 10-ю записями (каждая запись для отдельной акции) и 10 полями в каждой записи (параметры по каждой отдельной бумаге). Клиент производит анализ данных как за длительный период (день - неделя), так и за короткий (от часа вплоть до последней поступившей котировки) и на основе анализа принимает решение об осуществлении покупки/продажи(через API) определенной акции. Собственно весь этот процесс был организован на Access. Access принимал данные по ODBC, по таймеру с интервалом примерно 150 мс происходил анализ данных (т.е. независимо от того произошли изменения или нет). И из него же поступали транзакции. Вообщем нагрузка была достаточно большая и хотелось как-то уйти от этих таймеров плюс появилась необходимость в написании отдельного клиента, через которого происходило бы управление всем процессом. Может вы и правы. Для начала реализую задачу с помощью обычных запросов клиента через опред. интервал. Далее будет видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:22 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
Т.е. каждые 150 мс заново происходил анализ всех ста параметров (а точнее истории данных параметров) данной таблицы, хотя за это время могло измениться всего один или два. А если в дальнейшем их будет больше? (а это обязательно будет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:26 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
> Автор: Konst_One > я на это уже намекал автору. похоже, что он с того конца копает :) Да не мешайте человеку работать. :)) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:29 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
> Автор: profts > Т.е. каждые 150 мс заново происходил анализ всех ста параметров (а > точнее истории данных параметров) данной таблицы, хотя за это время могло > измениться всего один или два. А если в дальнейшем их будет больше? (а это > обязательно будет) Ну так заведи в базе таблицу в которую будут складыватся результаты анализа. А сам анализ проводи в тригерах и результат анализа заноси в эту таблицу. А читай уже готовые данные. Тогда у тебя будут данные анализа всегда актуальны сразу после вставки данных, и программе нужно будет только перечитать их, а не пересчитывать каждые 150 мс -- С уважением Горбонос Игорь Леонидович Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:35 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
> Да не мешайте человеку работать. :)) Да уж. С учетом того, что человек два месяца об Accesse слышал только то, что он входит в пакет MS Office, а по поводу программирования - видел в книжном кучу книг с непонятными названиями. :) Поэтому даже то что проделал - считаю для себя пусть небольшим, но достижением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:35 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
авторКлиент производит анализ данныхЭто операция программная или этим занимается человек? Если программная, то я бы попробовал перенести анализ в триггер, а клиенту отдавать только уведомления о покупке/продаже. Скорее всего, таких случаев меньше, чем "бездействие", т.е. не покупаем и не продаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:40 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
> Это операция программная или этим занимается человек? Если программная, то я бы попробовал перенести анализ в триггер, а клиенту отдавать только уведомления о покупке/продаже. Скорее всего, таких случаев меньше, чем "бездействие", т.е. не покупаем и не продаем. Да, конечно программная. Собственно осуществить переход с Accessa и решил только из-за отсутсвия в нем триггеров. А триггер умеет реагировать на изменение отдельного поля или все-таки вешается целиком на таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:44 |
|
||
|
Как отследить изменение в таблице MS SQL?
|
|||
|---|---|---|---|
|
#18+
> Автор: profts > А триггер умеет реагировать на изменение отдельного поля или все-таки > вешается целиком на таблицу? вешается на таблицу целиком, но в нем есть COLUMNS_UPDATED с помощью которого можно проверять какие столбцы изменялись -- С уважением Горбонос Игорь Леонидович Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 11:53 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35422003&tid=2162081]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
57ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 442ms |

| 0 / 0 |
