7.7 Взаимодействие с MySQL через ADODB

Тема в разделе "Обмен данными в "1С:Предприятие 7.7"", создана пользователем evgPinsk, 14 май 2013.

  1. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Пытаюсь из 1с закидывать инфу в БД сайта через ADODB. Очень много времени уходит на поиск инфы (документации), может гдето есть Help по ADODB применительно к 1с 7.7 ?
    Сейчас застрял на проблеме добавления данных объекта RecordSet. Строка НаборЗаписей.AddNew(); выдаёт ошибку:
    "Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки"

    вот код:

    Код:
    cnn = CreateObject("ADODB.Connection");
    СтрокаСоединения = "DSN=comp";
    cnn.open(СтрокаСоединения);
    НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
    запрос= "SELECT table.* FROM table;";
    НаборЗаписей=cnn.Execute (запрос);
    НаборЗаписей.AddNew();
    НаборЗаписей.Fields("name_ru-RU").Value=1;
    НаборЗаписей.Update();
    т.е. получается что объект НаборЗаписей открывается только для чтения. Каким образом его открыть для записи?
  2. Herby
    Offline

    Herby Опытный в 1С

    Регистрация:
    21 фев 2013
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Попробуйте с таким параметром:

    НаборЗаписей.CursorLocation = 3;
  3. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    видел такую рекомендацию, у меня всёравно выдаёт ошибку
  4. Herby
    Offline

    Herby Опытный в 1С

    Регистрация:
    21 фев 2013
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    на мисте эта проблема вроде решалась, не видели?
  5. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
  6. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Чтото не нашёл
  7. Herby
    Offline

    Herby Опытный в 1С

    Регистрация:
    21 фев 2013
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Попробуйте так:

    Код:
    НаборЗаписей.CursorType = 3;
    НаборЗаписей.LockType = 3;
    НаборЗаписей.Source = "SELECT table.* FROM table";
    НаборЗаписей.Open();
    
    НаборЗаписей.AddNew();
    НаборЗаписей.Fields("name_ru-RU").Value=1;
    НаборЗаписей.Update();
    
  8. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Да, я уже понял что нужно использовать метод Open а не Execute. Но пока не врубаю, каким образом связать объект cnn (cnn = CreateObject("ADODB.Connection");) и объект НаборЗаписей
    В моём примере это
    Код:
    НаборЗаписей=cnn.Execute (запрос);
    А в вашем примере как?

    По идее както так:
    Код:
    НаборЗаписей=cnn.CreateObject("ADODB.Recordset");
    но выдаёт ошибку такой код

    Ура нашёл ). Вот так
    Код:
     НаборЗаписей .ActiveConnection = cnn; 
    Всё заработало, рекордсет открылся для записи
  9. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Насколько я понял, объект ADODB.Recordset не может работать с параметрами SQL запросов. Можно ли в моём случае для выборки данных из таблицы table использовать объект adodb.command ( у него есть возможность задаватьпараметры запросов)? Но чтобы также сохранилась возможность добавлять данные через AddNew ?
  10. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Сам и отвечаю - да можно.
    Код:
    cmd = CreateObject("adodb.command"); НаборЗаписей.Open(cmd);
  11. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Осталось разобраться каким образом у объекта adodb.command указать параметры. Чтото пока синтаксис мне не понятен
  12. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    аналог объекта Recordset в 1С8 - Выборка.
    аналог объекта Command - Запрос

    вот и исходите из этого.

    ну а ссылку на MSDN я вам давал - там полное описание объектов ADO со всеми потрохами и с примерами на vb.
    про параметры - у объекта Command есть свойство Parameters - это коллекция параметров, а также метод CreateParameter, который создает новый параметр
  13. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Всё верно, с теорией я уже разобрался. Не знаю синтаксис текста запроса с параметрами.
    я задаю так
    Код:
    запрос = "PARAMETERS kod_1c long;SELECT table.* FROM table WHERE table.kod1c=[@kod_1c];"
    и Cmd.Execute выдаёт ошибку синтаксиса
  14. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    запрос = "SELECT table.* FROM table WHERE table.kod1c=@kod_1c"
  15. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Никак не могу создать сам параметр
    Код:
    Param = Cmd.CreateParameter("@kod_1c",1,3,3,3);
    ошибка " Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом."
  16. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    тип параметра (второй аргумент) какой? а то нет типа с кодом 1 в списке типов
    направление параметра (третий аргумент) - входящий(1) или можно вообще не ставить
    размер (четвертый аргумент) - можно ставить, можно нет, не для всех типов имеет смысл
  17. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Я уже устал эксперементировать со значениями, ну никак не проходит.
    Код:
    запрос="PARAMETERS @kod_1c long;SELECT table.* FROM table WHERE table.kod1c=@kod_1c;";
    cnn = CreateObject("ADODB.Connection");
    СтрокаСоединения = "DSN=comp";
    cnn.open(СтрокаСоединения);
    cmd = CreateObject("adodb.command");
    oPara = CreateObject("adodb.parameter");
    cmd.ActiveConnection = cnn;
    cmd.CommandText=запрос;
    cmd.Parameters.Refresh();
    oPara = Cmd.CreateParameter();
    oPara.name="@kod_1c";
    oPara.Type=3;
    oPara.value=3;
    Cmd.Parameters.Append(oPara);
    
    НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
    НаборЗаписей.ActiveConnection = cnn;
    НаборЗаписей.Source=запрос;
    НаборЗаписей.Open(cmd);
    
    на последней команде выскакивает ошибка:
    Microsoft OLE DB Provider for ODBC Drivers: [MySQL][ODBC 5.2(a) Driver][mysqld-5.1.40-community]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PARAMETERS @kod_1c long;SELECT m2n76_jshopping_categories.* FROM m2n76_jshopping_' at line 1
  18. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    мускула под рукой нет, проверить не могу пока, но с mssql такое работает
    Код:
    запрос="SELECT * FROM m2n76_jshopping_categories WHERE kod1c=?";
    cnn = CreateObject("ADODB.Connection");
    СтрокаСоединения = "DSN=comp";
    cnn.open(СтрокаСоединения);
    cmd = CreateObject("adodb.command");
    oPara = CreateObject("adodb.parameter");
    cmd.ActiveConnection = cnn;
    cmd.CommandText=запрос;
    cmd.Parameters.Refresh();
    oPara = Cmd.CreateParameter("p1", 1);
    oPara.Type=3;
    oPara.value=3;
    Cmd.Parameters.Append(oPara);
    НаборЗаписей = Cmd.Execute();
    
    Пока Не НаборЗаписей.EOF Цикл
    // обрабатываем
    НаборЗаписей.MoveNext();
    КонецЦикла
    
  19. TopicStarter Overlay
    evgPinsk
    Offline

    evgPinsk Опытный в 1С

    Регистрация:
    27 окт 2010
    Сообщения:
    193
    Симпатии:
    0
    Баллы:
    26
    Всё верно. Но у вас в тексте SQL запроса нет строки "PARAMETERS @kod_1c;" Если я у себя убираю данную строку, всё проходит, но приэтом не происходит фильтрации по условию, т.е. как я понимаю параметр не срабатывает. Если же её ставлю эту строку в текст запроса, то ошибка синтаксиса вылазит
    т.е. запрос "SELECT m2n76_jshopping_categories.* FROM m2n76_jshopping_categories WHERE m2n76_jshopping_categories.kod1c=@kod_1c;"; ghj[jlbn gj cbynfrbceec, но при этом условие WHERE не обрабатывается. Т.е. запрос пропускает все записи.
    а
    "PARAMETERS @kod_1c; SELECT m2n76_jshopping_categories.* FROM m2n76_jshopping_categories WHERE m2n76_jshopping_categories.kod1c=@kod_1c;"; выдаёт ошибку по синтаксису

Поделиться этой страницей