powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB & MS SQL. Проблема перевода в SINGLE USER через ADO
25 сообщений из 26, страница 1 из 2
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254232
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех.
Как уже понятно многим стало, не получается перевести из программы на VB, которая работает с базой на MS SQL в SINGLE USER
Подключаюсь к базе через ADO используя Provider=SQLOLEDB
Наслышан про проблемы создания скрытых подключений в ADO, но как это исключить?
Хотя бы перед переводом в SINGLE USER и обратно?
Может быть перед выполнением инструкции "почистить" дополнительные подключения?
Или как?
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254308
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как происходит работа с данными, в частности запись в базу и какой курсор используется?
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254338
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

чтение через
Код: plaintext
rstTemp.Open strSQL, cnnMain, adOpenKeyset, adLockReadOnly

курсор не выставляю, по дефолту идет

запись в основном 95%ов сказал бы через
Код: plaintext
1.
2.
strSQL="INSERT INTO.... UPDATE..."
Connection.Execute strSQL

есть пара "участков" кода где выставлен курсор adUseClient
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254371
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по дефолту adUseServer

в общем-то, если не используется открытие рекордсета для записи, адо лишних соединений не плодит, по крайней мере у меня.

ну а что видно в списке соединений?
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254387
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

пробую получить коннекты к базе через
Код: plaintext
select spid, db_name(dbid), status from master.dbo.sysprocesses where db_name(dbid)=N'DBNAME'

до коннекта уже выходит одно подключение со статусом sleeping

забыл сказать что еще используется пулинг подключений и запретить это не смогу
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254391
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо:
Код: plaintext
rstTemp.Open strSQL, cnnMain, adOpenKeyset, adLockReadOnly

надо так:
Код: plaintext
1.
Set rstTemp.ActiveConnection = cnnMain
rstTemp.Open strSQL, , adOpenKeyset, adLockReadOnly

тогда будет использоваться всегда одно соединение cnnMain
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254441
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

хмм... не знал про это.
сейчас сделал чуть по другому, предварительно перевел в базу в SINGLE_USER режим
затем, попробовал запустить клиентскую прогу, подключение прошло успешно, после подключения были операции обращения к базе по схеме
Код: plaintext
1.
rst.Open strSQL, cnnMain, ...
проблем не было
были еще обращения к хранимкам, ошибка возникла как раз в них, т.е. скрытое создание подключений
хранимки запускаются в виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
With cmdSP
	.ActiveConnection = cnnMain
	.CommandType = adCmdStoredProc
	.CommandText = "SP_EncryptString"
	...
	...
End With

и при выполнении таких хранимок и выкидывает с ошибкой:
Cannot open database "DBNAME" requested by the login. The login failed.
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254457
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не открыт ли при этом какой-нибудь рекордсет?
я сталкивался с тем, что при открытом рекордсете при попытке открыть другой на том же соединении, АДО плодит еще одно соединение. При этом все нормально, если рекордсет ForwardOnly-ReadOnly - не плодит.
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254496
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
With cmdSP
	Set .ActiveConnection = cnnMain
	.CommandType = adCmdStoredProc
	.CommandText = "SP_EncryptString"
	...
	...
End With
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254501
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всегда надо Set делать, иначе может создать новый экземпляр подключения
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254576
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА не открыт ли при этом какой-нибудь рекордсет?
я сталкивался с тем, что при открытом рекордсете при попытке открыть другой на том же соединении, АДО плодит еще одно соединение. При этом все нормально, если рекордсет ForwardOnly-ReadOnly - не плодит.

возможно, но.... чтобы не оставлять открытых recordset'ов нужно будет всю логику программы переделывать

Konst_Oneвсегда надо Set делать, иначе может создать новый экземпляр подключения
спасибо за совет, переделал но по любому не выкидывает
ммм....


вообще я это делал конечно для монопольного доступа к данным, точнее чтобы сменить операционный день
но так как перевести базу в SINGLE USER через ADO не получается, либо получится только переделав всю программу
приходится обдумывать другие варианты, скажем так эмуляции монопольного режима, на ум приходит 2 варианта:

1. Создаю таблицу TblExclusive, и есть глобальная переменная rstExclusive в клиентской программе.
Клиентская программа при подключении к базе данных, открывает таблицу TblExclusive следующим способом:
Код: plaintext
1.
rstExclusive.Open "SELECT * FROM TblExclusive", cnnMain, adOpenKeyset, adLockOptimisitc
и этот recordset закрывается тока при закрытии программы.
В участке кода где нужно "инициализировать" монопольный доступ, клиентская прога пытается открыть таблицу TblExclusive с HINT'ом XLOCK, т.е.
Код: plaintext
SELECT * FROM TblExclusive WITH (XLOCK, HOLDLOCK)
И Если не выдает ошибку значит нет других подключений, если же ошибка - коннекты есть

Но такой метод не получается реализовать, XLOCK по любому срабатывает

2. Другой метод отслеживать подключения к базе на уровне SQL Server'а. Но здесь тоже много "подводных камней", может быть в силу отсутствия опыта в разработке под MS SQL, или может быть из-за специфики логики работы приложения.
Дело в том что к базе подключаются через один логин, а сессии пользователей и пользователи управляются на логическом уровне клиентской прогой, т.е. таблица TblUsers и TblUserSessions и т.д. Проблема в отслеживании дисконнектов и т.д.

Может быть у вас уже был опыт разработки в этом направлении?

Спасибо
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254584
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понял вашу проблему, с чем вы там боритесь?
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254598
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

организация монопольного доступа
есть база на SQL Server 2008 R2, клиент написан на VB
нужно чтобы определенные операции реализовывались в монопольном режие, перевод в SINGLE USER в ADO не получается
ну поэтому и ищу обходные пути
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254713
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то странное задание какое-то. в монопольный режим через osql, например, можно базу перевести скриптом
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37254960
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

ну это само собой, просто после перевода в монопольный режим нужно "проделать" кое-какие запросы через хранимки и recordset'ы
поэтому эта версия пока что отпадает
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255004
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekKonst_One,

ну это само собой, просто после перевода в монопольный режим нужно "проделать" кое-какие запросы через хранимки и recordset'ы
поэтому эта версия пока что отпадает

и в чём проблема? g
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255006
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перевели скриптом, отключились, подключились прогой своей , сделали, что нужно, отключились
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255320
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneперевели скриптом, отключились, подключились прогой своей , сделали, что нужно, отключились

я вот сейчас перевожу скриптом, подключаюсь прогой
но и в этом случае хранимки не работают почему то, хотя я изменял коды
Код: plaintext
1.
2.
3.
4.
5.
With cmdSP
          .ActiveConnection = cnnMain
          ...
          ...
End With

на
Код: plaintext
1.
2.
3.
4.
5.
With cmdSP
        Set .ActiveConnection = cnnMain
        ...
        ...
End With

Поэтому и ищу альтернативные способы контроля монопольного доступа
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255342
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё должно работать. если у вас база переведена в режим одного пользователя и вы не можете подключиться, то скорее всего соединение уже занято кем-то, проверяйте
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255397
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

тестовый сервак у меня на ноуте, кроме меня никто не подключен
не работает, поэтому я и начал "карты раскрывать"
в свое время пытался реализовать журналирование изменений где клиент был написан тоже на VB база на MS SQL и ADO
из-за того что на ADO создаются "лишние" коннекты пришлось пойти обходными путями
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255502
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверяйте всякие контролы, может вы что-то используете в программе на основе соединений с базой
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255511
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только recordset'ы
свойства подключений которых выше приводил, хранимки и есть пара cnnMain.Execute strSQL
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255533
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если везде у вас используется только одно глобальное соединение, которые вы открываете при старте программы, то должно работать.

Код: plaintext
Set obj.ActiveConnection = cn

должно быть для всех видов объектов.
это всё можно промониторить профайлером на сервере SQL. добейтесь чтобы ваша прога делала только один коннект в обычном режиме, потом уже пробуйте в монопольном.
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37255863
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneесли везде у вас используется только одно глобальное соединение, которые вы открываете при старте программы, то должно работать.

Код: plaintext
Set obj.ActiveConnection = cn

должно быть для всех видов объектов.
...
...


сделал так, но не помогло почему то
можно еще поискать через Profiler, но полюбому это кажется мне долгой историей

ммм... я пока мест подумал о другой схеме, авторизация через клиентскую программу работает через хранимку
в коде хранимки добавил
Код: plaintext
1.
SET @SessionContext=CAST('DBNAME:'+CAST(@SessionID AS CHAR( 20 )) as varbinary( 128 ))

и затем в месте установки монопольного режима можно проверить через
Код: plaintext
select cast(context_info as char( 128 )) from sys.dm_exec_sessions where LEN(cast(context_info as char( 128 )))> 0 
Есть ли еще другие подключения
...
Рейтинг: 0 / 0
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
    #37256541
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас явно что-то с логикой работы программы не то. вы видимо пытаетесь из уже открытого соединения установить монопольный доступ к базе. так нельзя. надо через консоль (утилита командной строки osql) серверную выполнить перевод сервера в монопольный режим, все остальные соединения к серверу при этом будут убиты (поищите скрипт на форуме MS SQL, его неоднократно выкладывали). потом osql сеанс закрываете и уже после этого можете запускать свою программу и коннектиться к серверу.

PS
проверьте, может у вас ещё job-ы какие-нибудь на сервере работают, тогда агента надо остановить.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB & MS SQL. Проблема перевода в SINGLE USER через ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]