Имя: Пароль:
1C
 
Как получить строку коннекта к SQL через ADO?
Ø
0 Sl
 
01.03.05
14:58
по разным соображениям не хочется прописывать строку явно в коде: надо переписывать при подключении к другой базе, безопасность...
1 Дяпти
 
01.03.05
15:02
  с=СоздатьОбъект("DataLinks");
  с.PromptEdit(Connect);
  СтрокаСоединенияСБазой=с.ConnectionString;
2 Денис2
 
01.03.05
15:03
Function XOR(Val ParA, Val ParB)
  Res = 0;
  Koef = 1;
  For BitNumber = 1 To 8 Do
    BitA = ParA % 2;
    BitB = ParB % 2;
    ParA = Int(ParA / 2);
    ParB = Int(ParB / 2);
    BitC = (BitA + BitB) % 2;
    Res = Res + BitC * Koef;
    Koef = Koef * 2;
  EndDo;
  Return Res;
EndFunction
//*****
Procedure OnOpen()
Var CurDir, SQLKeyCode[36], ConnectCode[200];
  FilePath(CurDir);
  ConnectFile = IBDir() + "1Cv7.DBA";
  If FS.ExistFile(ConnectFile) = 0 Then
    Message("Это не SQL - база!", "!");
    Form.Close();
    Return;
  EndIF;
  FSO = CreateObject("Scripting.FileSystemObject");
  F = FSO.OpenTextFile(ConnectFile, 1);
  ConnectLen = 0;
  While F.AtEndOfLine = 0 Do
    ConnectLen = ConnectLen + 1;
    ConnectCode[ConnectLen] = Asc(F.Read(1));
  EndDo;
  F.Close();
  FSO = 0;
  SQLKey = "19465912879oiuxc ensdfaiuo3i73798kjl";
  For i = 1 To 36 Do
    SQLKeyCode[i] = Asc(Сред(SQLKey, i, 1));
  EndDo;
  Connect = "";
  For i = 1 To ConnectLen Do
    Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i - 1) % 36 + 1]));
  EndDo;
  Message(Connect);
EndProcedure
3 Sl
 
01.03.05
15:10
(1),(2) спасибо
только вот незадача, как в (1) получить "connect",
а в (2) непонятно куда это прицепить в 1С
:)
4 Дяпти
 
01.03.05
15:12
Ой, не смотри ты на (1). Но если интересно, то надо вот так:
Connect=СоздатьОбъект("adodb.connection");
+(1)
еще раз сорри за тупняк.
5 Денис2
 
01.03.05
15:16
(3) Вообще-то это на языке 1с :-)) И цепляй куда надо :-)))))))))
6 Sl
 
01.03.05
15:21
(4) Вы меня наверно не так поняли,
у меня есть SQL-ные базы, рабочая, тестовые. мне хочется использовать прямые запросы через ADO для отчетов. чтоб соединится с SQL надо писать строку соединения,
нельзя ли получить строку из текущего соединения 1С?
может я что то неправильно говорю, я пока не силен в этом
7 Sl
 
01.03.05
15:29
(6) :)
после Вашего кода я написал:
  Соединение = СоздатьОбъект("ADODB.Connection");
  Попытка Соединение.Open(Connect);
    Предупреждение("ОК");
  Исключение
    Предупреждение("Невозможно установить соединение");
    Возврат;
  КонецПопытки;
пишет что невозможно установить соединение, что то не так :(
8 Дяпти
 
01.03.05
15:30
(5) Читать (2). Если это работает - это то, что тебе надо: дешифрует файл 1cv7.dba и выводит информацию о сервере, базе, логине и пароле, через которые работает 1С.
9 Sl
 
01.03.05
15:36
(8)
    Connect=СоздатьОбъект("adodb.connection");
  с=СоздатьОбъект("DataLinks");
  с.PromptEdit(Connect);
  СтрокаСоединенияСБазой=с.ConnectionString;
  
После с.PromptEdit(Connect); у меня вызывается некое диалоговое окно... :) а хотелось бы получить строку текущего соединения, но все равно спасибо, интересно
10 Gloom
 
01.03.05
15:43
(7)
  Connect=СтрЗаменить(Connect,"""},{""",";");
  Connect=СтрЗаменить(Connect,"{{""","");
  Connect=СтрЗаменить(Connect,"""}}","");
  Connect=СтрЗаменить(Connect,""",""","=");
Соединение = СоздатьОбъект("ADODB.Connection");
  Попытка Соединение.Open("Driver=SQL Server;"+Connect);
    Предупреждение("ОК");
  Исключение
    Предупреждение("Невозможно установить соединение");
    Возврат;
  КонецПопытки;
11 Sl
 
01.03.05
15:53
(10) В итоге получилась строка:
"Driver=SQL Server;Server=ps-3;DB=RTest;UID=Rob"
не получается соединения, хоть ты тресни!
может пароля не хватает?
12 dralex
 
01.03.05
16:00
(11)Если проблемы со строкой соединения, тебе сюда: http://www.connectionstrings.com/
13 Gloom
 
01.03.05
16:10
(11)Значит (2) криво работает...
14 Денис2
 
01.03.05
16:16
(13) (2) придумал не я, кто-то прислал мне энту обработку...
Я обычно делаю так
Сервер = ConSQL.GetParam(КаталогБазы,"server");
База = ConSQL.GetParam(КаталогБазы,"base");
Пользователь = ConSQL.GetParam(КаталогБазы,"uid");
Пароль = ConSQL.GetParam(КаталогБазы,"psw");
СтрСоединения=""""+ConSQL.GetConnectStr(КаталогБазы)+"""";
используя ConnectSQL
15 Fynjy
 
01.03.05
16:20
как вариант ...
Пуск-Настройка-ПУ
Администрирование - Источники данных
Files DSN создаем что надо и смотрим строку наш файлик
16 Sl
 
01.03.05
16:24
(14) а что за объект ConSQL, если не секрет )?
17 dralex
 
01.03.05
16:25
Я тут что-то торможу. 1С подключается к SQL через ODBC? А в вопросе было - как подключиться через ADO? Ведь это не одно и тоже?
18 Денис2
 
01.03.05
16:29
(16)
Библиотека ConnectSQL.
Описание.
Библиотека предназначена для расшифровки файла-описания подключения к SQL-серверу 1Cv7.dba. Библиотека раелизует алгоритм программы unsql. Просто мне показалось несколько неудобным, что параметры возвращаются в виде файла, который будет лежать на диске, и к нему будет доступ всем желающим. Функция из этой библиотеки возвращает в строковом виде один из четырех параметров необходимых для соединения с SQL-сервером.
(17) а ADO через ODBC сама работает :-)))))))
19 Sl
 
01.03.05
16:31
(17) да, я спрашивал как получить строку для подключения через ADO, т.е. надо каким то образом из текущего подключения 1С получить сервер, базу, пользователя, пароль
20 Sl
 
01.03.05
16:34
(18) не подскажете где взять упомянутую библиотеку и подключить к 1С?
21 dralex
 
01.03.05
16:34
(18)Т.е. ты хочешь сказать, что ConnectionString для работы через ADO и для работы через ODBC - одна и та же?
22 Денис2
 
01.03.05
16:35
(20) могу прислать
(21) да
23 Sl
 
01.03.05
16:38
(22) нашел) надо регистрировать( Получается надо регистрировать на всех машинах сети?
24 dralex
 
01.03.05
16:38
(19)Где посмотреть какая должна быть строка подключения я тебе написал в (12). Пользователь в 1С с точки зрения SQL - один. Он же является владельцем базы 1С (Data Base Owner - DBO). Очень часто это - sa.
25 Денис2
 
01.03.05
16:39
(23) А зачем? База на сервере? Вот там и регистри и запускай. Прописывай в константу (хоть каждые полчаса) :-)
26 Sl
 
01.03.05
16:47
(25) спасибо. но честно говоря как то не слишком удобно получается, надо заводить константу, заполнять, только после этого можно прописывать в отчетах и соединятся с сервером... как то извращенчески :)))
27 Денис2
 
01.03.05
16:49
(26) Все удобней, чем перелопачивать _все_ отчеты, в случае, если решитесь поставить на sa пароль, или вообще сделать trusted connection
28 Gloom
 
01.03.05
16:50
В принципе, можно и без ВК корректно dba распотрошить...
30 Кочуров
 
02.03.05
10:55
(2) Может работать некорректно, так как файл dba может после содержать нетекстовые символы и Scripting.FileSystemObject не отработает с ним. Скорее всего, это выразится в том, что файл прочитается на полностью.
То есть с dba надо работать как в двоичным файлом.
31 Sl
 
02.03.05
11:01
(30) в моем случае именно так и произошло, пользователь обрезался, пароля вообще не было, нет ли у Вас более грамотного разбора файла dba из 1С?
32 Кочуров
 
02.03.05
11:05
(31) http://v7backup.narod.ru - исходник на VBS. Там есть расшифровка и разбор файла - все работает. Надо на 1С переписать.
Пользуясь случаем, выражаю признательность Gloom'у за помощь, которую он мне оказал при разработке этого куска.
33 fisher
 
02.03.05
11:10
2(32) А как в 1С без ВК корректно прочитать двоичный файл?
34 Sl
 
02.03.05
11:11
мне это в ближайшее время не под силу (переписать на 1С тексты VBS).
Но все равно спасибо за участие:)
35 Кочуров
 
02.03.05
11:17
2 (33) Да так же, как и на VB Script, наверно :)
36 1cvirus
 
02.03.05
11:29
ConnectString="Driver={SQL Server};Server=192.168.10.115;Database=sklad;Trusted_Connection=yes";
37 fisher
 
02.03.05
11:41
2(35) Понял. Наверное и (2) должно заработать без проблем, если переписать чтение dba через ADODB.Stream.
ЗЫ. Вообще говоря, даже не ясно что хуже с точки зрения безопасности (именно это упоминается в сабже) - наличие в коде в открытом виде секретной информации или алгоритма её расшифровки ;)
38 Gloom
 
02.03.05
12:00
(37)
"Вообще говоря, даже не ясно что хуже с точки зрения безопасности ..." - "Эт, точно" © тов. Сухов
ЗЫ. Чтобы (2) работало, надо одно слово исправить...
39 Sl
 
02.03.05
12:12
(38) у меня не работает, если "Scripting.FileSystemObject"->"ADODB.Stream"
40 Gloom
 
02.03.05
12:14
(39)Я сказал одно слово, а у тебя два...
41 Sl
 
02.03.05
12:17
насчет безопасности, раз эта информация хранится в dba и ее можно расшифровать, причем в интернете есть готовые программы по расшифровке, это уже не секретная информация. для меня важно чтобы не надо было переписывать код при работе с разными базами.
42 Sl
 
02.03.05
12:22
(40) чтоже это за слово, не томи пжалста!)
43 Sl
 
02.03.05
13:58
похоже не судьба дождаться ответа)...
44 Кочуров
 
02.03.05
14:06
(43) Я верю, что Gloom ответит - он слов на ветер не бросает. Просто ему некогда, наверно - работа от участвия в форуме отвлекает или еще что...
45 Sl
 
02.03.05
14:14
Всем спасибо за участие, я нашел что хотел, кому интересно:
Function XOR(Val ParA, Val ParB)
  Res = 0;
  Koef = 1;
  For BitNumber = 1 To 8 Do
    BitA = ParA % 2;
    BitB = ParB % 2;
    ParA = Int(ParA / 2);
    ParB = Int(ParB / 2);
    BitC = (BitA + BitB) % 2;
    Res = Res + BitC * Koef;
    Koef = Koef * 2;
  EndDo;
  Return Res;
EndFunction
//*****
Функция ПолучитьСтрокуСоединения()
Var CurDir, SQLKeyCode[36], ConnectCode[200];
  FilePath(CurDir);
  ConnectFile = IBDir() + "1Cv7.DBA";
  If FS.ExistFile(ConnectFile) = 0 Then
    Сообщить("Это не SQL - база!", "!");
    Return 0;
  EndIF;
  FSO = CreateObject("Scripting.FileSystemObject");
  F = FSO.OpenTextFile(ConnectFile, 1);
  ConnectLen = 0;
  While F.AtEndOfStream = 0 Do
    While F.AtEndOfLine = 0 Do
      ConnectLen = ConnectLen + 1;
      ConnectCode[ConnectLen] = Asc(F.Read(1));
    EndDo;
    If F.AtEndOfStream = 0 Then
      F.SkipLine();
      ConnectLen = ConnectLen + 1;
      ConnectCode[ConnectLen] = 10;
    EndIf;
  EndDo;
  F.Close();
  FSO = 0;
  SQLKey = "19465912879oiuxc ensdfaiuo3i73798kjl";
  For i = 1 To 36 Do
    SQLKeyCode[i] = Asc(Сред(SQLKey, i, 1));
  EndDo;
  Connect = "";
  For i = 1 To ConnectLen Do
    Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i - 1) % 36 + 1]));
  EndDo;
  Connect=СтрЗаменить(Connect,"""},{""",";");
  Connect=СтрЗаменить(Connect,"{{""","");
  Connect=СтрЗаменить(Connect,"""}}","");
  Connect=СтрЗаменить(Connect,""",""","=");
    Возврат "Driver=SQL Server;"+Connect;
КонецФункции
//*******************************************
Процедура Сформировать()
    стрКон=ПолучитьСтрокуСоединения();
  Соединение = СоздатьОбъект("ADODB.Connection");
  Соединение.ConnectionTimeOut=20;
  Соединение.CursorLocation=3;
    Попытка
    Соединение.Open(стрКон);
    Предупреждение("Удалось установить соединение");
  Исключение
    Предупреждение("Невозможно установить соединение");
    Возврат;
  КонецПопытки;
КонецПроцедуры
//*******************************************
46 Gloom
 
02.03.05
14:19
(45)Молоток!
Правда, достаточно было в (2) AtEndOfLine на AtEndOfStream исправить...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.