|
|
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Для написания сервиса использовал приведенный здесь пример Сергея Мерзликина VB6SVC. Можно ли (и как) из сервиса "законектиться" через ODBC к БД (MS SQL). Что-то типа: Set AdoConn = New ADODB.Connection Set AdoCmd = New ADODB.Command AdoConn.ConnectionString="DSN=......" AdoConn.Open AdoCmd.ActiveConnection=AdoConn AdoCmd.CommandText="Select ....." AdoCmd.CommandType=.... AdoCmd.Execute и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2009, 19:34 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
IMOLДля написания сервиса использовал приведенный здесь пример Сергея Мерзликина VB6SVC. Да, прошу прощения, вот ссылка на пример: http://www.sql.ru/forum/actualthread.aspx?tid=178105&hl=vb6svc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2009, 23:50 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 12:26 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Посмотрите IP адрес и юзера, в DSN сервисе и подставляйте их, вместо User и Data Source. Все работает замечательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 12:36 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Я, наверное, плохо изложил проблему или немного туплю... :) Проблема в следующем. При подстановке рабочего кода в сервис, последний при запуске сообщает, что "Процесс был неожиданно завершен (ош.1067)". Я думаю, проблема в возможности использования объекта ADODB, а не в значении параметра ADOConn.ConnectionString? Пример кода: ..... If IsNTService Then Set ADOConn = New ADODB.Connection Set ADOCmd = New ADODB.Command ADOConn.ConnectionString = "......" ADOConn.Open ADOCmd.ActiveConnection = ADOConn SetServiceState SERVICE_RUNNING App.LogEvent "AutoScet started" Do ..... ADOCmd.CommandText = "SELECT * FROM ....." ADOCmd.CommandType = adCmdText If Not (ADOCmd.Execute.BOF Or ADOCmd.Execute.EOF) Then SetNum = ADOCmd.Execute.Fields("SetNum").Value OtherDate = ADOCmd.Execute.Fields("OtherDate").Value End If ...... Loop While MsgWaitObj(1000&, hStopPendingEvent, 1&) = WAIT_TIMEOUT SetServiceState SERVICE_STOPPED App.LogEvent "AutoScet stopped" SetEvent hStopEvent MsgWaitObj INFINITE, hnd, 1& CloseHandle hnd End If ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 14:05 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
DSN вы какой сделали? вам нужен machine(system) DSN. проверьте под каким аккаунтом запускаеться сервис (через консоль управления сервисами, закладка LogOn у вашего сервиса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 14:08 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
IMOL, проверьте работоспособность самой базы данных и протестируйте коннект (Test Connection). Вариантов на сброс коннекта множество. И погуглите немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 16:11 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
БД работоспособна, как и сам код. Просто понадобилось некоторые операции "запихнуть" в сервис. Где-то в поиске я нашел указание на то, что в "теле" сервиса могут стоять операции типа: "+", "-" :) и API-шные функции. Оно вообщем-то на подсознательном уровне понятно почему :). Но вот очень хочется :) послать несколько запросов в БД (MS SQL) из сервиса. Моим убогим в этой области умом я понимаю, что библиотеку с используемыми модулями надо как-то "особенно прикрутить" (минуя References) к сервису. Ясно, что сервис просто не находит "все эти ADODB". Но вот, как это сделать? Наверняка кто-то сталкивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 17:44 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
adoddb тут не причем. проверяйте доступность вашей базы из под логина, под которым стартует ваш сервис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 17:51 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Konst_One, DSN - system, account - System. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 17:53 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
ну так и проверяйте доступность базы для этого акка. если у вас домен и сервер на другом компе, то я бы посоветовал вам установить сервис под той доменной учеткой, которая имеет доступ к SQL-серверу и в нужную вам базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 17:57 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Konst_One, база данных стоит локально на сервере домена. На нем же пытаемся запустить сервис. Однако, думаю, что здесь нет проблемы "аккаунта" , так как я оставлял в тексте программы только одну строчку: Set ADOConn = New ADODB.Connection (а также:Set ADOConn = CreateObject("ADODB.Connection")) и получал тот же результат:"Процесс был неожиданно завершен...". С таким же успехом я создавал другие объекты, "прикрученные" в References - во всех случаях идентичный результат. То есть до самого "connect" мы, вроде бы, вообще не доходим. Однако, если в сервисе организовать какой-нибудь код на базе API, например, - все работает на ура. Естественно, из "Источников данных (ODBC)" тест соединения к БД проходит успешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2009, 22:53 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Ну тогда Вам врядли кто поможет решить Вашу проблему, если коннект с ODBC идет, а с VB сбрасывается....Для меня немного непонятно. Попробуйте моим способом приконектится, у меня сервис и в ODBC, и также отдельно подключаюсь с VB, вышеуказанным способом. С VB даже все эффективней пашет.... И попробуйте вытащить инструмент ADODC (Microsoft ADO Data Control), и с помощью него подконектится, там есть вариант ODBC.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2009, 13:16 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
У меня такая же фигня происходила под w2k. Как победил, уже не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2009, 14:53 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Собственно проблема разрешилась. Решение в топике чуть ниже: http://www.sql.ru/forum/actualthread.aspx?tid=652008 При создании службы с использованием объекта NTService1 все "фунциклирует". Я пытался "слепить" службу на основе примера, представленного Сергеем Мерзликиным: http://www.sql.ru/forum/actualthread.aspx?tid=178105&hl=vb6svc. Для нее не требуется NTService1. Учитывая свою прикладную специальность и ограниченность в вопросах программирования, смею предположить, что это разные способы написание служб. При этом где-то в мозгах отложилось, что второй пример - это как раз "полноценная" служба, а микрософтовский модуль ее вроде как "иммитирует" :). Прошу прощения за свои бестолковые комментарии. В заключение всем огромное спасибо и вопрос к уважаемому kiv-1980. Так сказать, для окончательного запутывания вопроса :). Ваш сервис работает с использованием NTService1 или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2009, 15:12 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Вышеуказанный способ использую давно. И проблем не наблюдаю. Запускается на всех компах с любыми MS оболочками, и это меня вполне устраивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2009, 10:23 |
|
||
|
ODBC в сервисе
|
|||
|---|---|---|---|
|
#18+
Способ написания сервисов один — должен быть создан отдельный поток, с которым мог бы общаться диспетчер сервисов. Сервисконтролы берут на себя эту задачу. На VB с потоками работать невозможно без адских плясок с бубном, которых в примере Мерзликина нет. Этот пример лишь делает вид, что работает. Польза от него чисто академическая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2009, 14:49 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35905747&tid=2161179]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 409ms |

| 0 / 0 |
