|
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
|
ну так еще
|
|||
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
|
а так ?
|
|||
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. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |