Не могу остановить Асинхронное соединение (ADO)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tofik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 30.04.2004 (Пт) 13:18

Не могу остановить Асинхронное соединение (ADO)

Сообщение tofik » 15.05.2004 (Сб) 9:42

Так осуществляю соединение:
Код: Выделить всё
Conn_String = "Provider=SQLOLEDB.1;Persist Security_ _Info=False;User ID=sa;Initial Catalog=MyDataBase;Data Source=server" 
Set Conn = New ADODB.Connection 
Conn.ConnectionString = Conn_String 
Conn.ConnectionTimeout = 10 
Conn.CommandTimeout = 10 
Conn.Open Conn_String, , , adAsyncConnect

Но если сервера с именем "server" в сети нет, попытка соединения будет длиться до таймаута
Допустим я не хочу ждать и делаю попытку отменить соединение:
Код: Выделить всё
Conn.Cancel

что, как я полагаю верно! Однако выполнение проги останавливается на этом операторе и точно также слетает только после таймаута

Почему???

tofik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 30.04.2004 (Пт) 13:18

Сообщение tofik » 18.05.2004 (Вт) 16:13

Ну что, никто не знает, ПОЧЕМУ не работает Cancel???
Попробуйте ради интереса, не поленитесь!
Заодно и мне помощь окажите!

tofik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 30.04.2004 (Пт) 13:18

Сообщение tofik » 21.05.2004 (Пт) 11:58

ААУУУУУУУУУ!
ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.05.2004 (Пт) 12:03

MSDN писал(а):Cancels execution of a pending, asynchronous Execute or Open method call.

Возможно дело именно в том, что Connect не был перечислен?
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 21.05.2004 (Пт) 12:52

Нет, дело не в этом. В конце концов, соединение открывается именно методом Open, а он там есть.
Если хочешь работать с асинхронностью, будь добр ловить события от коннекшна. У меня событие InfoMessage() выскочило практически сразу после вызова Open, так что реально можно не ждать таймаута, а получить информацию сразу. Другой вопрос, какой таймаут выставлять, ибо он его действительно ждет... 0 нельзя, у меня среда повесилась :)
Да, и не забывай при каждом удобном случае вызывать Conn.Errors.Clear - помогает.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.05.2004 (Пт) 13:47

Вот кусочек моего старенького кода - все работает нормально:

Код: Выделить всё
g_cn.Open "File Name=" & g_sAppUdl", , , adAsyncConnect
Do While g_cn.State = adStateConnecting
        DoEvents
Loop


P.S Мне хватает DoEvents - я так просто отдаю события форме заставки в которой кое что в это время крутится...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tofik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 30.04.2004 (Пт) 13:18

Сообщение tofik » 21.05.2004 (Пт) 14:46

Спасибо!
Но видимо вы меня не поняли!

Уточняю свой вопрос:

Как "разорвать" соединение не дожидаясь таймаута!

tofik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 30.04.2004 (Пт) 13:18

Сообщение tofik » 21.05.2004 (Пт) 15:11

Попробуй прописать в строке соединения, нарошно, не правильное имя сервера!
Соединение затянется на время таймаута
А если таймаут=100?

Представь:
Ты пользователь!
Ты видишь форму в которой тебя просят прописать имя сервера,
ты не долго думая пишешь: "MYSERVER"
Жмешь на кнопочку и ждешь...... ждешь......
и вот блин ты вдруг понимаешь, что надо-то не "MYSERVER", а "MY_SERVER" и тут как раз и появляется необходимость в CENCEL!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.05.2004 (Пт) 15:53

Чтобы уменьшить ошибку набора имени сервера можно выдавать пользователю список доступных серверов.

Ну а завершить операцию открытия коннекта до истечения таймаута не удается... Да я и не могу припомнить чтобы где-то такая фича была (в программах работающих с SQL). Жалко, конечно...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 22.05.2004 (Сб) 12:58

2 Andrey Fedorov: Список доступных серверов ты соберешь только для своего домена (ну, может, еще егойные трасты зацепишь). А если у тебя сервак в инете? И будешь ты писать руками в лучшем случае его DNS, а в худшем - IP. Так что это не вариант.

2 Tofik: Поставь таймаут 5. Или 3. Если сеть быстрая, а канал стабильный, то даже для инет-сервака этого обычно достаточно. И не парься с асинхронностью, только нервы истреплешь.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList