Имя: Пароль:
1C
1С v8
1С и MySQL - не выполняет запросы
,
0 KatyariK
 
20.10.11
11:55
такая проблема. Из 1с нужно периодически коннектится к MySql базе (база пропусков - чтобы анализировать внесенные табеля)

так вот - через драйвер ODBC подключаюсь к серверу -  к серверу подключается все ОК (State = 1)

db = Новый COMObject("ADODB.Connection") ;
   db.ConnectionString =("DRIVER=MySQL ODBC 3.51 Driver; SERVER=192.1.2.1;DataBase=kkkk; UID=root;PWD=");
   
   Попытка
       db.Open();
       Сообщить("MySQL база подключена!!!");
   Исключение
       Сообщить("Не могу подключиться к базе!!!");
   КонецПопытки;
------------------------------------------------------------
Дальше пытаюсь выполнить запросы - подвисает и все -  и ничего не могу сделать (примеры запросов самые простые например получить версию сервера select version())

Делал через ADODB.Connection  метод Execute() и через ADODB.Recordset ..... короч виснет -  вот примеры как  я пробовал (их конечно гораздо больше но ...) Может у кого то такое было??? Подскажите -  а то уже пару дней сижу и не знаю что делать :(

   //1.
   //Метод ADODB.Recordset
   
   //Recordset = Новый COMОбъект("ADODB.Recordset");
   //Recordset.ActiveConnection = db;

   //Source  = "(select CodeDepartment, NameDepartment from department)";
   //
   //Command=Recordset.ActiveCommand;
   //Recordset_Всего=Command.open("SELECT COUNT(*) FROM "+Source);
   //Если НЕ Recordset_Всего.EOF Тогда
   //        ВсегоЗаписейВТаблице=Recordset_Всего.Fields(0).Value;  
   //КонецЕсли;
   
   //2.
   //
   //Стр = "select version()";
   //Попытка
   //    db.Execute(Стр);
   //    Сообщить("Good");
   //Исключение
   //    Сообщить("Bad " + ОписаниеОшибки());
   //КонецПопытки;
   
   
   //3.

   //Сет = Новый COMObject("ADODB.Recordset");
   //ТекстЗапроса = "select CodeDepartment, NameDepartment from department;";
   //Сет.Open (ТекстЗапроса, db, 1);
   //Пока Сет.EOF() = 0 Цикл
   //    Сообщить (" id="+Сет.Fields.Item("CodeDepartment").value+" name="+Сет.Fields.Item("NameDepartment").value);
   //    Сет.MoveNext();
   //КонецЦикла;
   //db.Close()
   
   
   //4.
   //    Попытка
   //Команда = Новый COMОбъект("ADODB.Command");
   //Команда.ActiveConnection = db;
   //Команда.CommandText = "select version()";
   //Команда.CommandType = 1;

   //НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
   //Попытка
   //    НаборЗаписей.Open(Команда);
   //    Сообщить("Good");
   //Исключение
   //    Сообщить("Bad " + ОписаниеОшибки());
   //КонецПопытки;
   
   
   
   //5 еще одна неудачная попытка
   
       //Устанавливаем кодировку для нашего подключения (дополнительно)...
   //Command= new COMObject("ADODB.Command");
   //Command.CommandText = "set names cp1251";
   //Command.ActiveConnection = db;
   //Command.CommandType = 1;
   //Попытка
   //    Command.Execute();
   //    Сообщить("Good");
   //Исключение
   //    Сообщить("Bad " + ОписаниеОшибки());
   //КонецПопытки;
   //
   ////Теперь выполняем скрипт
   //Command= new COMObject("ADODB.Command");
   //Command.CommandText = "select version()";
   //Command.ActiveConnection = db;
   //Command.CommandType = 1;
   //Попытка
   //    Command.Execute();
   //    Сообщить("Good");
   //Исключение
   //    Сообщить("Bad " + ОписаниеОшибки());
   //КонецПопытки;
   ////Закрываем соединение.
   //db.Close();


I need help!!!!!!
1 Азат
 
20.10.11
11:56
я какую-то дллку для связи с мускл использовал, там вроде все норм было, без косяков
2 Матрейя
 
20.10.11
12:04
conn = СоздатьОбъект("ADODB.Connection");
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};SERVER="+СокрЛП(константа.mysqlserver)+";DATABASE="+СокрЛП(константа.mysqldatabase)+";UID="+СокрЛП(константа.mysqluser)+";PWD="+СокрЛП(константа.mysqlpwd)+";OPTION="+3+";STMT=SET CHARACTER SET cp1251";
conn.open(ConnectionString);      
rs=conn.execute(".......");

Проверь файрвол, мож блокирует.
3 KatyariK
 
20.10.11
12:08
dll - ка есть, но как ее подцепить?????
Файрвола там как бы нету - сам проверял, да и программки для работы с етой MySql базой на С++ работат ... т.е. не блокирует :(
4 Матрейя
 
20.10.11
12:09
3. драйвер я так понимаю установлен?
5 KatyariK
 
20.10.11
12:10
да установлен
6 KatyariK
 
20.10.11
12:10
DRIVER={MySQL ODBC 3.51 Driver} -  без него не подключалося к базе
7 Grusswelle
 
20.10.11
12:13
8 KatyariK
 
20.10.11
12:15
ну так он установлен
9 Kondarat
 
20.10.11
12:17
(8) У меня с этим Driver={MySQL ODBC 5.1 Driver} все работает на ура.
10 KatyariK
 
20.10.11
12:19
ну просто для пропускной системы программа написала под MySql 3.23 - поетому я ставил MySQL ODBC 3.51 Driver (да и в принципе этот коннектор проверен временем).
11 shuhard
 
20.10.11
12:20
(10) сделай файлик udl и им проверь + получи строку соединения
12 KatyariK
 
20.10.11
12:22
udl .... а есть пример - чтобы не искать -  потому что ни разу не делал
13 shuhard
 
20.10.11
12:25
(12) пример
ну
делаешь текстовый файл
переименовываешь
открываешь
далее всё очевидно
14 KatyariK
 
20.10.11
12:30
создал -  но в поставщике не виже MySQL ODBC Driver - хотя через панель управления при добавлении источников данных ODBC -  он есть, или чтото не так делаю?
15 KatyariK
 
20.10.11
12:31
наше в источнике выбрать ....  а что дальше смотретЬ:?
16 KatyariK
 
20.10.11
12:34
вопрос -  какой начальный каталог выбраТЬ??? -  у меня ругается -  не выполнен вход в систему .... мне пользователя указать какого -  админа MySql?
17 shuhard
 
20.10.11
12:35
(16) каталог kkkk
пользователь и пароль root и бланк
18 KatyariK
 
20.10.11
12:37
проверка подключения выполнена ... каталог забил по умолчанию, пользоватлея  root прописал ....
Что дальше я могу тут увидеть?
19 shuhard
 
20.10.11
12:38
(18) строку подключения,
которую надо вставить в код
20 KatyariK
 
20.10.11
12:44
вставил - все тож самое - на том же месте виснет :(
Подключение проходит -  а выполнение запроса виснет ((
21 shuhard
 
20.10.11
12:45
(20) показывай код,
коннект ADODB  явно рабочий
22 KatyariK
 
20.10.11
12:55
conn = Новый COMОбъект("ADODB.Connection");
   
   ConnectionString ="DATABASE=kristal;DESCRIPTION=MySQL ODBC 3.51 Driver;DSN=MySQL ODBC 3.51 Driver;OPTION=0;PORT=0;SERVER=192.1.2.132;UID=root;";
   
       
   Если conn.state=0 Тогда
       conn.open(ConnectionString);
   КонецЕсли;
   
   СтрЗапроса = "Select vertion()";
   Если Найти(СтрЗапроса,"select")>0 Тогда
       Table=conn.execute(СтрЗапроса);
       Пока Table.EOF() = 0 do
           Value1= Table.Fields(0).Value; // текстовое поле
           
           Сообщить(Value1);
           
           
           Table.MoveNext();
       КонецЦикла;
       Table.Close();
   Иначе
       conn.execute(СтрЗапроса);
   КонецЕсли;

   Если conn.state=1 Тогда
       conn.Close();
   КонецЕсли;
23 KatyariK
 
20.10.11
12:55
при выполнении execute() - виснет
24 shuhard
 
20.10.11
12:56
(22) Select vertion может version ?
25 KatyariK
 
20.10.11
13:07
по синтаксису правильно version() -  даже через EMS MySQL Manager.
да я любой другой запрос вставляю -  все равно подвисает -  я уже много запросов перепробовал
26 Матрейя
 
20.10.11
13:08
25. Я же пример дал. Кодировку укажи...
27 KatyariK
 
20.10.11
13:11
(Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 3.51 Driver]Unknown character set: 'cp1251'
       conn.open(ConnectionString);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 3.51 Driver]Unknown character set: 'cp1251'   ...... вот выдало ошибку при подключении, что это может бытЬ?
28 KatyariK
 
20.10.11
13:12
я вчера пробовал кодировку сразу добавлять - тож ругалася так и не коннектилось. А без кодировки коннект прошел. По умолчанию стоит кодировка в базе latin1 - только что глянул.
29 Матрейя
 
20.10.11
13:13
27. поставь кодировку базы. я ведь просто пример дал. Оставь как в примере все, только свои значения
30 Матрейя
 
20.10.11
13:14
не пиши  db.ConnectionString
31 Матрейя
 
20.10.11
13:15
пиши как я пример дал. только create object замени и все
32 KatyariK
 
20.10.11
13:24
На основании етого примера:
conn = СоздатьОбъект("ADODB.Connection");
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};SERVER="+СокрЛП(константа.mysqlserver)+";DATABASE="+СокрЛП(константа.mysqldatabase)+";UID="+СокрЛП(константа.mysqluser)+";PWD="+СокрЛП(константа.mysqlpwd)+";OPTION="+3+";STMT=SET CHARACTER SET cp1251";
conn.open(ConnectionString);      
rs=conn.execute(".......");

conn =  Новый COMОбъект("ADODB.Connection");
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.1.2.132;DATABASE=kristal;UID=root;PWD=;OPTION="+3+";STMT=SET CHARACTER SET latin1";
conn.open(ConnectionString);      
rs=conn.execute("Select vertion()");

Выдает при conn.open(ConnectionString) ошибку:
{Форма.Форма(219)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 3.51 Driver]Unknown character set: 'latin1'
   conn.open(ConnectionString);      
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 3.51 Driver]Unknown character set: 'latin1'
33 Матрейя
 
20.10.11
13:26
значит поставь cp1251 или utf8
34 KatyariK
 
20.10.11
13:26
в строке поключения пробовал - такие же ошибки выдает. только  с cp1251 или utf8
35 szhukov
 
20.10.11
13:26
(22)Table=conn.execute(СтрЗапроса); - так по-моему и не взлетит.

Можно попробовать так:
RS = Новый COMОбъект(ADODB.Recordset);
RS = conn.execute(СтрЗапроса);

Но лучше:
RS = Новый COMОбъект(ADODB.Recordset);
RS.Open(СтрЗапроса, conn);
36 szhukov
 
20.10.11
13:28
(34) Не меняй подключение, оно же у тебя проходит нормально. Не плоди ошибки.
Поменяй код выполнения запроса.
37 KatyariK
 
20.10.11
13:29
RS = Новый COMОбъект(ADODB.Recordset);
RS = conn.execute(СтрЗапроса);

Но лучше:
RS = Новый COMОбъект(ADODB.Recordset);
RS.Open(СтрЗапроса, conn);  -  попробовал -  виснет на методе Open :(
38 KatyariK
 
20.10.11
13:31
соединение ели не задаешь кодировку проходит, state = 1 выводит.
А вот при выполнении запроса виснет ... :(
39 KatyariK
 
20.10.11
13:33
RS = Новый COMОбъект(ADODB.Recordset);
RS = conn.execute(СтрЗапроса);
метод execute = - не онаружен ругается
40 szhukov
 
20.10.11
13:34
(39) Что-то с conn, значит. Закрывается соединение может.
41 KatyariK
 
20.10.11
13:35
а как проверить?
42 Матрейя
 
20.10.11
13:36
а conn и не существует при коде 39
43 KatyariK
 
20.10.11
13:38
ну с кодом 39 понятно. А что еще можно проверить?
44 szhukov
 
20.10.11
13:40
(42) А код (39) здесь не причем :)
Вы должны открыть соединение, а затем создать объект Recordset и через его метод выполнить запрос и получить набор записей.
45 szhukov
 
20.10.11
13:40
+(44) Значит все-таки соединение у вас не открывается.
46 szhukov
 
20.10.11
13:43
(43) Примерно так:

Conn1 = Новый COMОбъект("ADODB.Connection");
Conn1.ConnectionString =  стрПодключения;
       
попытка
   Conn1.Open();
исключение
   Сообщить ("Проблемы с подключением к серверу баз данных" );
   Инфо = ИнформацияОбОшибке();
   ПоказатьИнформациюОбОшибке(Инфо);
   Возврат;
КонецПопытки;

RS = Новый COMОбъект("ADODB.Recordset");
   
попытка
   RS.Open("select * from table какой-то LIMIT 10", Conn1 );
исключение
   Сообщить ("Ошибка");
   Инфо = ИнформацияОбОшибке();
   ПоказатьИнформациюОбОшибке(Инфо);
   Возврат;
КонецПопытки;
47 KatyariK
 
20.10.11
13:46
на первой попытке все проходит - т.е. Conn1.Open();проходит.
RS.Open("select * from table какой-то LIMIT 10", Conn1 ) -  виснет :(
48 shuhard
 
20.10.11
13:49
(47) поржал
то "Select vertion()" виснет,
то select * from table какой-то LIMIT 10" не работает
49 Матрейя
 
20.10.11
13:50
+48 присоединяюсь. Автор типичный одынэсник :-)
50 KatyariK
 
20.10.11
13:52
все поржали -  а помочь никто не может :(
запрос для примера был дан :(
51 Матрейя
 
20.10.11
13:53
RS = Новый COMОбъект("ADODB.Recordset");
   
попытка
   RS.Open("select * from table какой-то LIMIT 10", Conn1 );
исключение

rs сдесь не подключен к базе!!!!!!!!!!
52 shuhard
 
20.10.11
13:54
(49) угу,
типичный неудачник
53 KatyariK
 
20.10.11
13:56
млин ну так дайте толковый совет что делать?
54 shuhard
 
20.10.11
13:57
(53) разобраться,
не тупо кодировать чужой код
55 Матрейя
 
20.10.11
14:03
53.Давай по пордяку. Сделай системный dsn , назови его r55 например.
Потом выполни из 1с такой код
   conn = Новый ComObject("ADODB.Connection");
   ConnectionString="DSN=r55";
   conn.open(ConnectionString);
56 Матрейя
 
20.10.11
14:04
+55 Разумеется проверь в системном дсн подключение, там кнопка есть тест
57 KatyariK
 
20.10.11
14:06
Соединение успешно установлено. Дальше.
58 KatyariK
 
20.10.11
14:06
это я уже проделал давно
59 Матрейя
 
20.10.11
14:12
57.  rs=conn.execute("select * from ИмяТаблицы");
пока rs.eof()=0 цикл
Сообщить("УРА");
rs.movenext();    
КонецЦикла;
60 Матрейя
 
20.10.11
14:13
ИмяТаблицы замени на реальное
61 KatyariK
 
20.10.11
14:14
rs=conn.execute("select * from Table");  -  в етом месте виснет выполнение
62 Матрейя
 
20.10.11
14:18
Table - таблица дорлжна иметь имя. например "select * from users"
63 szhukov
 
20.10.11
14:18
(61) Ты хоть одну таблицу в базе знаешь?
сделай выборку из нее...
select * from Table - нигде не сработает. Table - это имя известной тебе таблицы (нужно заменить)
Например:
select * from users
64 KatyariK
 
20.10.11
14:18
так и сделал
65 szhukov
 
20.10.11
14:18
(62) опередил :)
66 KatyariK
 
20.10.11
14:19
я знаю все таблицы в базе :)))
т.к.  все пока делаю вручную  через EMS MySQL Manager
67 KatyariK
 
20.10.11
14:19
делаю те операции что мне нужны -  через EMS MySQL Manager (а то сейчас и тут залошите)
68 szhukov
 
20.10.11
14:20
Ну, так чего ты фигню какую-то написал в (47)
запрос свой покажи к какой-то таблице
69 Матрейя
 
20.10.11
14:21
66. Пиши то, что конкретно у тебя написано.  dsn  - прям база прописана или только mysql сервер?
70 shuhard
 
20.10.11
14:22
(69) угу
топик чистый развод
начиная с Select vertion()
71 KatyariK
 
20.10.11
14:26
1.dns -  прямо база прописана.
2.запрос самый первый и самый простой - select * from events- проще некуда чтобы выбрало мне все поля.
3. Запрос Select vertion() -  все равно должен выполняться -  чем он хуже других я не знаю :)) он тупо выводит версию твоего MySQL/ Подвоха сдесь нет -  просто нужно чтобы отработало.
4. Вам запросы написать:

UPDATE employee  set NumberCard = TabNumber
WHERE
  (
     (`employee`.`NumberCardIndex`  <> 0)
  )
к примеру.

Дело не в запросе просто. Нужно хотя бы чтобы этот отработал select * from events  -  (специально взял маленькую таблицу -  там всего 10 строк записей).
72 shuhard
 
20.10.11
14:57
(71) [Запрос Select vertion() -  все равно должен выполняться -  чем он хуже других я не знаю :)) он тупо выводит версию твоего MySQL]
ни хера он не выводит, кроме ошибки синтаксиса
73 KatyariK
 
20.10.11
15:01
ну у меня ошибки синтаксиса не выдает :)
74 KatyariK
 
20.10.11
17:49
короч все спасибо.
Нашел я как через дллку сделать -  точнее нашел пример -  все отлично отработало:
http://1c.proclub.ru/modules/mydownloads/personal.php?lid=3456&cid=83

Можно закрывать.