Имя: Пароль:
1C
1С v8
на сервере встроенная функция t-sql sp_getapplock отрабатывает нормально в 1С нет
0 Яшка Копытин
 
02.08.18
13:17
на сервере встроенная функция t-sql EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';
отрабатывает нормально
из 1С 8 нет

пСтрСоед = "driver={SQL Server};"+"server="+СокрЛП("test1c")+";"+"uid="+СокрЛП(Login)+"; "+"pwd="+СокрЛП(Password)+";"+"Database="+СокрЛП("SMP_2018");

GlobalConnection = Новый COMОбъект("ADODB.Connection");
GlobalConnection.Provider = "SQLOLEDB";
GlobalConnection.ConnectionTimeout = 15;
GlobalConnection.CommandTimeOut    = 30;
GlobalConnection.ConnectionString = пСтрСоед;
GlobalConnection.Open();
GlobalCommand = Новый COMОбъект("ADODB.Command");
GlobalCommand.ActiveConnection = GlobalConnection;
GlobalCommand.CommandType = 1;  ////ставил типы 1, 4,8
GlobalCommand.prepared = "true";
GlobalCommand.namedParameters   = "true";

///Здесь пытаюсь вызвать функцию

GlobalCommand.CommandText = "sp_getapplock";

////и пытаюсь передать в неё параметр

GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 3, 16, ));
GlobalCommand.Parameters(0).value = "exclusive";
GlobalCommand.Execute();

///пишет
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.

///пробую сделать по другому

GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@DbPrincipal", 200, 3, 16,"dbo"));
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@Resource", 200, 1, 12, "SC5197"));
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16, "exclusive"));
GlobalCommand.Execute();
///пишет
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.


///и даже вот так
СтрокаЗапроса =   "BEGIN TRAN;EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';";
GlobalCommand.CommandText = СтрокаЗапроса;
GlobalCommand.Execute();
///ошибок не выдает но и результата блокировки тоже нет


//////третий параметр менял с 0 до 4 не помогает
GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16,"exclusive"));


подскажите пожалуйста как правильно передать LockMode
1 sitex
 
naïve
02.08.18
13:37
(0) Я могу ошибаться , но попробуйте так GlobalCommand.Execute("И сюдать СтрокаЗапроса");
2 sitex
 
naïve
02.08.18
13:39
(1) + Как пример GlobalCommand.EXECUTE("SELECT @@VERSION")
3 Яшка Копытин
 
02.08.18
13:46
(0)
Ошибка при вызове метода контекста (Execute)
GlobalCommand.Execute("EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource =  'SC5197',@LockMode = 'exclusive';COMMIT TRAN;")  ;

по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.
на самом сервере
Выполнение команд успешно завершено.
4 Яшка Копытин
 
02.08.18
13:47
(1) и (2)
Ошибка при вызове метода контекста (Execute)
GlobalCommand.Execute("EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource =  'SC5197',@LockMode = 'exclusive';COMMIT TRAN;")  ;

по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.
на самом сервере
Выполнение команд успешно завершено.
5 sitex
 
naïve
02.08.18
13:50
(4) Убери  -> '
6 sitex
 
naïve
02.08.18
13:58
7 Яшка Копытин
 
02.08.18
14:07
(5) сделал так
GlobalCommand.Execute("EXEC sp_getapplock ; bPrincipal = ""dbo"", @Resource =  ""SC5197"",@LockMode = ""exclusive""")  ;

Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан.
8 sitex
 
naïve
02.08.18
14:14
(7) ссылку выше открывал? найди абзац "А.Вызов EXECUTE с передачей единственного аргумента" там же расписано требуется.
9 Яшка Копытин
 
02.08.18
14:40
уважаемый sitex  здесь сказано
https://msdn.microsoft.com/ru-ru/library/ms188332(v=sql.120).aspx

в абзаце А.Вызов EXECUTE с передачей единственного аргумента
При выполнении переменная может быть явно поименована.
EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
у меня нормально заходят параметры @bPrincipal = ""dbo"", @Resource =  ""SC5197"" чем они отличаются от @LockMode = ""exclusive""" ? да ни  чем
@LockMode такая же именованная процедура
как и @Resource
вот в чем затык.
10 Яшка Копытин
 
02.08.18
14:42
Парни поделитесь плиз, примером кода
для передачи из 1С во встроенную функцию T-sql
бъюсь уже какой день
11 Вафель
 
02.08.18
14:43
делай через текст, без параметров
12 Яшка Копытин
 
02.08.18
14:47
(11)
Для функции sp_getapplock  нужны параметры без них даж на сервере не работает.
и к тому же мне нужно конкретную таблицу блокировать
SC5197 и журнал.
13 mr freeman
 
02.08.18
14:51
Про getapplock на скульру тебе подсказали. Зачем тебе этот трэш, юзай упр. блокировки 1С
14 mr freeman
 
02.08.18
14:56
Ты там пишешь, это нужно для сообщения юзеру что процесс занят и проводить нельзя. Это выдирание гланд через задницу.
15 sitex
 
naïve
02.08.18
14:59
Текст = " BEGIN TRANSACTION
| DECLARE @result int
| EXEC @result = sp_getapplock @DbPrincipal = 'dbo' @Resource = 'SC5197', @LockMode = 'Exclusive' ";   и дальше  GlobalCommand.Execute(Текст);  Пробуй !
16 sitex
 
naïve
02.08.18
15:00
(10) Так же тут прочитай https://msdn.microsoft.com/ru-ru/library/ms189823(v=sql.120) Разрешения какие нужны.
17 sitex
 
naïve
02.08.18
15:01
Вообще тоже не понимаю для чего это вообще нужно.
18 Яшка Копытин
 
02.08.18
15:06
(14)(17) это нужно для 1С 77
а отлаживаюсь я на 8ке
sitex          не хотит работать как в (15) =((
19 Яшка Копытин
 
02.08.18
15:08
кто нибудь может платной консультацией поделиться ?
вообще возможно ли всё то что я затеваю
20 mr freeman
 
02.08.18
15:16
Платная консультация: не занимайся херней. С тебя тыща рублей
21 sitex
 
naïve
02.08.18
15:19
(18) А так  -> Текст = " BEGIN TRANSACTION
| DECLARE @result int
| EXEC @result = sp_getapplock 'dbo', 'SC5197',  'Exclusive' ";
22 hhhh
 
02.08.18
15:38
что с запятыми? где-то есть запятая, где-то нет. Это шаманство такое?
23 sitex
 
naïve
02.08.18
15:40
(22) Если  в (15) то да там одна , пропущена.
24 hhhh
 
02.08.18
15:43
(23) вообще тут нет двух топиков, где бы запятые одинаково стояли
25 sitex
 
naïve
02.08.18
15:43
Только что протестировал, на базе test  WS 2008R2 , что в 15 и ---> " BEGIN TRANSACTION
| DECLARE @result int
| EXEC @result=sp_getapplock @DbPrincipal=N'test', @Resource=N'1',@LockMode=N'Exclusive' ";  все норм работает. Хз что у тебя там не пашет
26 Яшка Копытин
 
02.08.18
15:50
(25)    sitex
Да заработала в (21)
Текст = " BEGIN TRANSACTION
| DECLARE @result int
| EXEC @result = sp_getapplock 'dbo', 'SC5197',  'Exclusive' ";
27 sitex
 
naïve
02.08.18
15:52
(26) Ну ТС в след раз пиши какая там у тебя версия sql.
28 Яшка Копытин
 
02.08.18
15:58
sitex Спасибо большое ! выручил

SQL Server 2008 R2    
10.50.6560.0
29 Яшка Копытин
 
02.08.18
16:35
еще вопрос, запускаю в студии
что бы снять блокировки
USE SMP_2018;
GO
BEGIN TRAN;
EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984', @LockOwner = 'Transaction' ;
GO

смотрю
    SELECT
        dm_tran_locks1.request_type,
        dm_tran_locks1.resource_database_id,
        dm_tran_locks1.resource_description,
        dm_tran_locks1.request_session_id,
        dm_tran_locks1.request_status,
        dm_tran_locks1.request_mode,
        dm_tran_locks1.request_owner_type,
        dm_tran_locks1.resource_associated_entity_id
        from  sys.dm_tran_locks as dm_tran_locks1

показывает что блокировки остались не снятыми,правильно ли снимать sp_getapplock с помощью
sp_releaseapplock в таком синтаксисе ?
EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984', @LockOwner = 'Transaction'  ;
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.