Имя: Пароль:
1C
 
ADODB.RecordSet Закрывается 1с
0 Likons
 
31.03.20
13:29
Добрый день , Ув. Коллеги )
Прошу помочь с моей бедой (
Необходимо получить данные из внешней MySQL (MariaDB) базы.
Уже очень долго бьюсь над обработкой (
Набросал следующие :

Функция ПодключитсяКSQL()
    Сервер="Сервер"; // IP адрес сайта
    ПользовательСервера="ПользовательСервера"; // имя пользователя базы данных
    ПарольСервера="ПарольСервера"; // пароль пользователя базы данных
    БазаСервера="БазаСервера";  // название SQL базы данных
    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение_param = "driver={MySQL ODBC 5.1 Driver}; server="+СокрЛП(Сервер)+"; uid="+СокрЛП(ПользовательСервера)+"; pwd="+СокрЛП(ПарольСервера)+"; database="+СокрЛП(БазаСервера)+"; STMT=SET CHARACTER SET utf8";
    Try
        Соединение.open(Соединение_param);
        СоединениеУстановлено = Истина;
        Сообщить("Соединение установлено");
    Except
        ТекстСообщения = ""+ТекущаяДата()+" Connection error: "+ОписаниеОшибки();
        Сообщить(ТекстСообщения);
        СоединениеУстановлено = Ложь;
        
    EndTry;
    return Соединение;
КонецФункции
Процедура Пример()
    Соединение = ПодключитсяКSQL();
    

    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    НаборЗаписей.ActiveConnection = Соединение;
    НаборЗаписей.Open("SELECT * FROM wp_wc_product_meta_lookup");
    
    Пока не НаборЗаписей.Eof() Цикл
        Сообщить("фыв");
        НаборЗаписей.MoveNext();
    КонецЦикла;
    НаборЗаписей.Close();
    Соединение.Close();  

КонецПроцедуры

Соединение устанавливается ,Open отрабатывает, но как только дело доходит до "Пока не НаборЗаписей.Eof() Цикл" 1с вылетает с сообщением о сохранение дампа (
Много гуглил на этот счет , народ советует
1.Отключать аппаратное ускорение монитора (на MS server его вообще не нашел , как ни странно , на win 10 не выключается)
2.Поставить другой драйвер коннектор (пробовал MariaDB connector 3.1 , MySql Coonector (3.1 , 5.1, 5.3, 8.0) соединение устанавливается только на MySQl 5.1 (
Буду благодарен за любую наводку )
1 Ёпрст
 
31.03.20
13:40
(0)

НаборЗаписей = Соединение.Execute("SELECT * FROM wp_wc_product_meta_lookup");
2 Likons
 
31.03.20
13:41
(1) Пробовал ( Та же картина (
3 Ёпрст
 
31.03.20
13:45
ну так еще


    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Соединение;
    Command.CommandText = "SELECT * FROM wp_wc_product_meta_lookup";
    RecordSet = Command.Execute();
4 Ёпрст
 
31.03.20
13:46
ну и попробовать заместо * пихать нужные поля, возможно вы пытаетесь получить тип, который в 1с-ине вообще не поддерживается
5 Likons
 
31.03.20
13:52
(4) Так тоже пробовал ( И перечисление полей , тоже ни к чему не привело (
Оно вроде как даже получает данные. Но не может сделать обход набора записей (
6 arsik
 
гуру
31.03.20
14:05
Добавь в 1С как внешние данные
7 Likons
 
31.03.20
14:06
(6) тоже пробовал , там другая беда (
Внешние источники данных
8 shuhard
 
31.03.20
14:09
(0)[Open отрабатывает]
ну так позырь отладчиком, что у него в свойствах
9 shuhard
 
31.03.20
14:17
(8) + тип курсора должен быть указан
вот же пример
https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-examples-programming-vb-ado.html
10 Ёпрст
 
31.03.20
14:31
а так ?


НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
НаборЗаписей.CursorType=3;
НаборЗаписей.LockType=1;
НаборЗаписей.CursorLocation=3;
НаборЗаписей.ActiveConnection = Соединение;
НаборЗаписей.Open("SELECT * FROM wp_wc_product_meta_lookup");
11 Likons
 
31.03.20
14:37
(10) (9) Поковырял отладчиком , так же попробовал твой код , спасибо за него )
Но в отладчике куча вот таких сообщений:

Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
В FieldsCount вот так :
    Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): Не был задан текст команды для объекта команды.
12 Ёпрст
 
31.03.20
14:57
ну и вот тут исправь

//  Пока не НаборЗаписей.Eof() Цикл
  Пока НЕ НаборЗаписей.Eof Цикл
13 Ёпрст
 
31.03.20
14:58
и попробуй LockType=2; //в msdn посмотри типы курсоров
14 Likons
 
31.03.20
15:02
(13) Перепробовал несколько вариантов курсоров , на часть из них вот так ругается :
Произошла исключительная ситуация (Microsoft Cursor Engine): Поставщик данных или другая служба вернули состояние E_FAIL.
15 shuhard
 
31.03.20
15:04
(12) +100500
Do Until rs.EOF

Loop
16 shuhard
 
31.03.20
15:08
(14)Свойства объекта Recordset CursorType, CursorLocation, LockType, параметры открытия Recordset

При открытии объекта Recordset есть возможность определить еще несколько очень важных его свойств (их можно определить как напрямую перед открытием, так и как дополнительные параметры метода Open()):

    первое свойство — CursorType, тип курсора. Это свойство определяется только перед открытием Recordset (после открытия оно доступно только на чтение). Курсор можно представить себе как указатель на записи в Recordset. В зависимости от типа курсора мы определяем возможности работы с Recordset и производительность выполняемых операций (чем больше возможностей, тем меньше производительность, и наоборот). Какие варианты значений возможны:
        adOpenForwardOnly — это значение используется по умолчанию. Оно оптимизировано для достижения максимальной производительности (он возможности будут минимальными). Курсор может двигаться только вперед, изменения, вносимые другими пользователями, видны не будут.
        adOpenStatic — тоже, что и предыдущий, за исключением того, что можно двигаться во всех направлениях;
        adOpenKeyset — позволяет двигаться в любом направлении, видны только изменения существующих записей другими пользователями (удаление старых и добавление новых не видны);
        adOpenDynamic — обеспечивает максимальные возможности: позволяет двигаться в любых направлениях, видны любые изменения в записях, производимые другими пользователями. К сожалению, провайдер Microsoft.Jet.OLEDB.4.0 этот тип курсора не поддерживает, поэтому с Access и Excel его использовать не получится.

        Свойство Recordset.RecordCount нормально функционирует только для курсоров типа Static и Keyset. Для курсоров типа ForwardOnly и Dynamic оно возвращает (-1), поскольку драйвер подключения не может определить количество записей.

    второе важное свойство — CursorLocation. Оно определяет, где будет создан курсор — на сервере или на клиенте. По умолчанию используется значение adUseServer — создавать на сервере. Есть возможность использовать значение adUseClient — создавать на клиенте. В целом практически во всех ситуациях удобнее и производительнее использовать серверные курсоры, за одним исключением — в реализации серверных курсоров на разных источниках данных больше отличий, поэтому если вы планируете работать с разными источниками, есть смысл подумать о клиентских курсорах.
    третье важное свойство — LockType. Это свойство определяет тип блокировок, которые будут наложены на записи на источнике, помещенные в Recordset. Можно использовать следующие значения:
        adLockReadOnly — записи в Recordset будут доступны только на чтение, вы не сможете их изменять. Это значение используется по умолчанию.
        adLockPessimistic — наиболее надежный с точки зрения целостности данных вид блокировки. Вы можете изменять записи в Recordset, но при начале изменения записи она блокируется на источнике таким образом, что другие пользователи не смогут обратиться к ней ни на чтение, ни на запись, пока вы не вызовете методы Update() или CancelUpdate().
        adLockOptimistic — это значение позволяет выиграть в производительности за счет проигрыша в надежности обеспечения целостности данных. Запись на источнике блокируется только на время выполнения метода Update(). Остальные пользователи могут одновременно с вами читать и изменять данные на источнике.
        adLockBatchOptimistic — то же самое, что обычное оптимистичное, но вместо немедленного обновления по одной записи используется пакетное обновление. В ситуации, когда изменяется большое число записей, такое решение позволяет выиграть в производительности.
17 shuhard
 
31.03.20
15:11
(16) +1
https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/cursortypeenum?view=sql-server-ver15
Постоянно     Значение     Description
адопендинамик     2     Использует динамический курсор. Видимыми могут быть дополнения, изменения и удаления других пользователей, а также все типы перемещений через набор записей , за исключением закладок, если они не поддерживаются поставщиком.
адопенфорвардонли     0     По умолчанию. Использует однопроходный курсор. Идентичен статическому курсору, за исключением того, что можно прокручивать только записи вперед. Это повышает производительность, если необходимо выполнить только один проход по набору записей.
адопенкэйсет     1     Использует курсор KEYSET. Как и динамический курсор, за исключением того, что вы не можете видеть записи, добавленные другими пользователями, хотя записи, удаляемые другими пользователями, недоступны из набора записей. Изменения данных, внесенные другими пользователями, по-прежнему видимы.
адопенстатик     3     Использует статический курсор, который представляет собой статическую копию набора записей, которые можно использовать для поиска данных или создания отчетов. Добавление, изменение или удаление других пользователей не отображается.
адопенунспеЦифиед     -1     Не указывает тип курсора.
18 Likons
 
31.03.20
15:29
(17) Спасибо , это очень познавательно ) Но CursorType и CursorLocation я уже перебрал много всяких разных (
19 Likons
 
31.03.20
15:56
Перебрал все комбинации CursorType , CursorLocation и LockType. Либо ошибка , либо все так же закрывается 1с(
20 shuhard
 
31.03.20
16:06
(19) кроме программистов есть и другие нужные специальности =)
21 Likons
 
31.03.20
16:34
(20) Вы намекаете на то , что у вас есть очевидное решение , до которого я не дошел ?
22 Ёпрст
 
31.03.20
17:14
(21) покажи свой код
23 Likons
 
31.03.20
23:17
Всем большое спасибо за участие ) Проблему решил )
Может кто то столкнется :
Разрядность драйвера коннектора должна совпадать с разрядностью платформы 1с.
В моем случае , как оказалось , была установлена платформа х86 ,а драйвер х64.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс