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

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

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

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

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

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

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

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

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

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

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

тогда будет использоваться всегда одно соединение cnnMain
...
Рейтинг: 0 / 0
11.05.2011, 11:41
    #37254441
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
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
11.05.2011, 11:47
    #37254457
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
А не открыт ли при этом какой-нибудь рекордсет?
я сталкивался с тем, что при открытом рекордсете при попытке открыть другой на том же соединении, АДО плодит еще одно соединение. При этом все нормально, если рекордсет ForwardOnly-ReadOnly - не плодит.
...
Рейтинг: 0 / 0
11.05.2011, 11:56
    #37254496
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
Код: plaintext
1.
2.
3.
4.
5.
6.
With cmdSP
	Set .ActiveConnection = cnnMain
	.CommandType = adCmdStoredProc
	.CommandText = "SP_EncryptString"
	...
	...
End With
...
Рейтинг: 0 / 0
11.05.2011, 11:57
    #37254501
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
всегда надо Set делать, иначе может создать новый экземпляр подключения
...
Рейтинг: 0 / 0
11.05.2011, 12:22
    #37254576
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
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
11.05.2011, 12:26
    #37254584
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
не понял вашу проблему, с чем вы там боритесь?
...
Рейтинг: 0 / 0
11.05.2011, 12:31
    #37254598
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
Konst_One,

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

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

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

и в чём проблема? g
...
Рейтинг: 0 / 0
11.05.2011, 14:24
    #37255006
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
перевели скриптом, отключились, подключились прогой своей , сделали, что нужно, отключились
...
Рейтинг: 0 / 0
11.05.2011, 15:59
    #37255320
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
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
11.05.2011, 16:05
    #37255342
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
всё должно работать. если у вас база переведена в режим одного пользователя и вы не можете подключиться, то скорее всего соединение уже занято кем-то, проверяйте
...
Рейтинг: 0 / 0
11.05.2011, 16:19
    #37255397
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
Konst_One,

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

Код: plaintext
Set obj.ActiveConnection = cn

должно быть для всех видов объектов.
это всё можно промониторить профайлером на сервере SQL. добейтесь чтобы ваша прога делала только один коннект в обычном режиме, потом уже пробуйте в монопольном.
...
Рейтинг: 0 / 0
11.05.2011, 19:45
    #37255863
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
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
12.05.2011, 11:18
    #37256541
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB & MS SQL. Проблема перевода в SINGLE USER через ADO
у вас явно что-то с логикой работы программы не то. вы видимо пытаетесь из уже открытого соединения установить монопольный доступ к базе. так нельзя. надо через консоль (утилита командной строки osql) серверную выполнить перевод сервера в монопольный режим, все остальные соединения к серверу при этом будут убиты (поищите скрипт на форуме MS SQL, его неоднократно выкладывали). потом osql сеанс закрываете и уже после этого можете запускать свою программу и коннектиться к серверу.

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


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