|
|
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
Имеется хранимая процедура, выполняется достаточно долго (1 - 5 мин.), соответственно через 30 сек. на последней строке вылетает с ошибкой "Время ожидания истекло". Как заставить ждать ответа от сервера дольше? На данный момент сделано так: Set LOADING = CreateObject("ADODB.Recordset") Set cnt = CreateObject("ADODB.Connection") cnt.Open "Provider=sqloledb;Data Source=" & server & ";Integrated Security=SSPI;Persist Security Info=False; CommandTimeout = 0;General Timeout=0; Initial Catalog=" & database, user, pwd LOADING.ActiveConnection = cnt LOADING.Source = sqlstring LOADING.Open ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2008, 11:16:02 |
|
||
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
После создания коннекта сделай: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2008, 17:42:35 |
|
||
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
Решение нашел на сайте майкрософта. cnt.Open "PROVIDER=SQLOLEDB;Data Source=" & server & ";ConnectionTimeout =0; Integrated Security=SSPI;Persist Security Info=False; Initial Catalog=" & database, user, pwd Параметр ConnectionTimeout =0 работает только для SQLOLEDB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2008, 12:27:01 |
|
||
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
Максим ЛеонидовичРешение нашел на сайте майкрософта. cnt.Open "PROVIDER=SQLOLEDB;Data Source=" & server & ";ConnectionTimeout =0; Integrated Security=SSPI;Persist Security Info=False; Initial Catalog=" & database, user, pwd Параметр ConnectionTimeout =0 работает только для SQLOLEDB.Ты не правильно нашел. ConnectionTimeout отвечает за время коннекта. То есть сколько секунд ждать ответа от сервера базы данных когда клиент еще только пытается к нему подключиться прежде чем выдать ошибку "сервер недоступен". А ты искал возможность выключить таймаут на выполнение отдельных команд. За это отвечает CommandTimeout. В твоем коде: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2008, 17:51:52 |
|
||
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
White Owl, ну тогда объясни работу этих параметров на двух примерах: НЕрабочий вариант (ошибка "Время ожидания истекло" вылетает через 30 сек на строке LOADING.Open): sqlstring = "exec STD_PLAN_PRODUCT_SOLD 4, '" & Beg & "', '" & fin & "', 1" cnt.Open "Provider=sqloledb;Data Source=" & server & ";Integrated Security=SSPI;Persist Security Info=False; CommandTimeout = 0;General Timeout=0; Initial Catalog=" & database, user, pwd LOADING.ActiveConnection = cnt LOADING.Source = sqlstring LOADING.Open рабочий вариант (здесь ждет сколько угодно выполнения процедуры): sqlstring = "exec STD_PLAN_PRODUCT_SOLD 4, '" & Beg & "', '" & fin & "', 1" cnt.Open "Provider=sqloledb;Data Source=" & server & ";ConnectionTimeout =0; Integrated Security=SSPI;Persist Security Info=False; Initial Catalog=" & database, user, pwd LOADING.ActiveConnection = cnt LOADING.Source = sqlstring LOADING.LockType = 3 LOADING.Open ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2008, 08:27:18 |
|
||
|
как поменять время ожидания ответа от сервера
|
|||
|---|---|---|---|
|
#18+
Максим ЛеонидовичWhite Owl, ну тогда объясни работу этих параметров на двух примерах:Все твои проблемы от невнимательности. В моем первом ответе (второе сообщение топика) я устанавливал проперть CommandTimeout объекта типа ADODB.Connection. Проперть объекта и параметр коннекта это две очень разные вещи. Класс ADODB.Command имеет свою собственную проперть CommandTimeout которую можно устанавливать разную для разных ADODB.Command объектов. Но так как все ADODB.Command создаются на основе какого-нибудь ADODB.Connection, то можно установить эту проперть для ADODB.Connection и все ADODB.Command будут ее наследовать. В том числе и невидимые ADODB.Command которые ты сам не создаешь, их создает и убиват ADO, когда ты заполняешь ADODB.Recordset напрямую из ADODB.Connection. Теперь про послдение примеры: В строке коннекта находятся только параметры коннекта, которые влияют на то как клиент будет подключаться к серверу. CommandTimeout не явлется параметром коннекта (твой не работающий пример). Поэтому он игнорируется и никак не влияет на реальные параметры коннекта и проперти установленного соединения. Во втором примере, ты устанавливаешь ConnectionTimeout, который является легальным параметром коннекта и работает. Он говорит твоему клиентскому драйверу, что если сервер указаный в Data Source в принципе пингуется и вроде-бы живой, то клиент будет ждать успешного коннекта до скончания веков, даже если сервер базы данных в это время уже мертвенький. До тех пор пока физический компьютер в сети и отвечает на сетевые запросы - клиент будет считать что БД тоже живая, хоть и тормозная. Почему второй вариант все-же работает? Потому что клиентский драйвер SQLOLEDB устанавливает по умолчанию свой внутренний CommandTimeout равным ConnectionTimeout'у. Но это уникальная особенность SQLOLEDB. И нельзя закладываться на то, что оно будет работать во всех версиях SQLOLEDB. На практике, это означает что если ты отдашь свой Эксель файл клиенту у которого другая версия Windows никто не гарантирует что твой макрос будет работать точно так же как и на твоей собственной машине. Универсальный способ управлять временем ожидания команды я уже показал - установить проперть CommandTimeout у объекта ADODB.Connection после установления соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2008, 18:17:27 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=209&tid=2180037]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
87ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 399ms |

| 0 / 0 |
