Имя: Пароль:
1C
1С v8
ADODB RecordSet AddNew()
0 vbh
 
11.05.12
12:31
Пытаюсь добавить новую строку, а мне: Ошибка при вызове метода контекста (AddNew)RecordSet.AddNew();по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.


   Конект = Новый ComОбъект("ADODB.Connection");
   СтрокаСоединения3 ="Provider=MSDAORA.1;Password=pswd;User ID=user;Data Source=dianet;Persist Security Info=True";
   Конект.ConnectionString = СтрокаСоединения3;
       Попытка
       Конект.Open();
       //Сообщить("Подключились к шине!");
   Исключение
       Сообщить("Подключение к шине не удалось!");
       Возврат;
   КонецПопытки;
   Command =Новый  ComОбъект("ADODB.Command");
   Command.ActiveConnection= Конект;
   Command.CommandText ="select * from errors";
   
   RecordSet = Новый ComОбъект("ADODB.Recordset");
   Recordset.Open("select * from errors",конект,2,4);
   RecordSet.AddNew();
   RecordSet.Fields("MSG").value="sd";
   RecordSet.Update();
   Сообщить(RecordSet.Fields("id").Value);
   Recordset.Close();
   RecordSet="";
   Конект.Close();
1 ДенисЧ
 
11.05.12
12:32
Продолжайте наблюдения.
2 ДенисЧ
 
11.05.12
12:32
А заодно доложите, чем insert не нравится.
3 vbh
 
11.05.12
12:34
через инсерт работает... делаю через addnew() чтобы сразу отловить новый id
Сообщить(RecordSet.Fields("id").Value);
4 vbh
 
11.05.12
12:37
пробовал и lock=3 (adLockOptimistic) тоже самое
5 shuhard
 
11.05.12
12:40
(4) может быть есть обязательные поля ?
6 vbh
 
11.05.12
12:45
(5) нету
вот все поля ошибка таже

   RecordSet = Новый ComОбъект("ADODB.Recordset");
   Recordset.Open("select * from errors",конект,2,4);
   RecordSet.AddNew();
   RecordSet.Fields("MSG").value="sd";
   RecordSet.Fields("NAME").value="name";
   RecordSet.Fields("DSC").value="not use";
   RecordSet.Fields("ETABLE").value="N";
   RecordSet.Fields("LOG").value="Y";
   RecordSet.Update();
7 shuhard
 
11.05.12
12:48
(6)
а ещё возможно стоит сделать курсор на стороне клиента
Recordset.CursorLocation = 3;
8 shuhard
 
11.05.12
12:48
9 vbh
 
11.05.12
12:50
не помогло

Recordset.Open("select * from errors",конект,3,4);
10 shuhard
 
11.05.12
12:52
(9) ты не то написал
adOpenDynamic(2) стоял правильно

попробуй

Recordset.CursorLocation = 3;
Recordset.Open("select * from errors",конект,2,3);
11 vbh
 
11.05.12
12:55
(10) тоже самое
12 vbh
 
11.05.12
12:56
по синтаксису вроде правильно тройку ставил

objRecordset.Open source,actconn,cursortyp,locktyp,opt
13 vbh
 
11.05.12
12:57
может в строке соединения что добавить надо?
14 shuhard
 
11.05.12
12:58
(13) с mdb вот так работает:
MyCon = Новый COMОбъект ("ADODB.Connection");
           MyCon.Open ("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\1.MDB");
           MyRst = Новый COMОбъект ("ADODB.Recordset");
           MyStr = "select * from zdania where NOM_REG_VI=1 and id_predpr=1 and id_ik=1 and id_zdan=1";
           MyRst.Open (MyStr, MyCon, 2, 3);//adOpenDynamic, adLockOptimistic
           MyRst.Fields("Resultat").Value="Киргуду"; // Присвоение
           MyRst.Update(); //Запись
           MyRst.Close();
           MyCon.Close();
15 vbh
 
11.05.12
13:01
те без всяких AddNew() просто проапдэйтить....сейсас опробую
16 vbh
 
11.05.12
13:03
Ошибка при установке значения атрибута контекста (Value) RecordSet.Fields("MSG").value="sd";
по причине:
Произошла исключительная ситуация (ADODB.Field): Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.

нет не хочет. сдается мне не тем объектом пользуюсь
17 shuhard
 
11.05.12
13:04
(16) покажи код
18 vbh
 
11.05.12
13:06
Конект = Новый ComОбъект("ADODB.Connection");
   СтрокаСоединения3 ="Provider=MSDAORA.1;Password=1C1C1C;User ID=1C;Data Source=dianet;Persist Security Info=True";
   Конект.ConnectionString = СтрокаСоединения3;
       Попытка
       Конект.Open();
       //Сообщить("Подключились к шине!");
   Исключение
       Сообщить("Подключение к шине не удалось!");
       Возврат;
   КонецПопытки;
   Command =Новый  ComОбъект("ADODB.Command");
   Command.ActiveConnection= Конект;
   Command.CommandText ="select * from errors";
   
   RecordSet = Новый ComОбъект("ADODB.Recordset");
   Recordset.Open("select * from errors",конект,2,3);
   //RecordSet.AddNew("MSG","sadfsdf");
   RecordSet.Fields("MSG").value="sd";
   //RecordSet.Fields("NAME").value="name";
   //RecordSet.Fields("DSC").value="not use";
   //RecordSet.Fields("ETABLE").value="N";
   //RecordSet.Fields("LOG").value="Y";
   RecordSet.Update();
   Сообщить(RecordSet.Fields("id").Value);
   Recordset.Close();
   RecordSet="";
   Конект.Close();
19 vbh
 
11.05.12
13:06
попробовал ещё так, тоже не работает


   RecordSet = Новый ComОбъект("ADODB.Recordset");
   Recordset.Open("select * from errors",конект,2,3);
   RecordSet.AddNew("MSG","sadfsdf");
20 shuhard
 
11.05.12
13:07
(18) а где
Recordset.CursorLocation = 3;
21 vbh
 
11.05.12
13:13
shuhard, прошу прощения...затупил

всё вроде заработало, щас юзера пропишу в конекте нормального и всё )))

{Форма.Форма.Форма(76)}: Ошибка при вызове метода контекста (Update)
   RecordSet.Update();
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for Oracle): ORA-01031: insufficient privileges


     ОчиститьСообщения() ;
   Конект = Новый ComОбъект("ADODB.Connection");
   СтрокаСоединения3 ="Provider=MSDAORA.1;Password=pswd;User ID=user;Data Source=dianet;Persist Security Info=True";
   Конект.ConnectionString = СтрокаСоединения3;
       Попытка
       Конект.Open();
       //Сообщить("Подключились к шине!");
   Исключение
       Сообщить("Подключение к шине не удалось!");
       Возврат;
   КонецПопытки;
   Command =Новый  ComОбъект("ADODB.Command");
   Command.ActiveConnection= Конект;
   Command.CommandText ="select * from errors";
   
   RecordSet = Новый ComОбъект("ADODB.Recordset");
   Recordset.CursorLocation = 3;
   Recordset.Open("select * from errors",конект,2,3);
   RecordSet.AddNew();
   RecordSet.Fields("MSG").value="sd";
   RecordSet.Fields("NAME").value="name";
   RecordSet.Fields("DSC").value="not use";
   RecordSet.Fields("ETABLE").value="N";
   RecordSet.Fields("LOG").value="Y";
   RecordSet.Update();
   Сообщить(RecordSet.Fields("id").Value);
   Recordset.Close();
   RecordSet="";
   Конект.Close();
22 shuhard
 
11.05.12
13:22
(21) ОК,
хорошо что MS не жадничает и выкладывает в MSDN баги по продуктам конкурента
23 vbh
 
11.05.12
13:23
Всё работает, но мой план в (3) не сработал ((( id возвращает Null
24 ДенисЧ
 
11.05.12
13:25
(23) А с чего бы он должен был вернуться?
25 shuhard
 
11.05.12
13:26
(23) http://www.sql.ru/faq/faq_topic.aspx?fid=214
Q8

Q8: Как получить значение счетчика только что добавленной записи?

A1: Если запись добавляется через рекордсет, то так:

rs.AddNew
переменная = rs!полесчетчика
...
rs.Update

'или

Set rs = ...OpenRecordset("...where 1=0") 'обязательно пустой рекордсет
rs.AddNew 'ровно один раз; при добавлении двух и более записей ничего не получится
...
rs.Update
rs.MoveFirst
переменная = rs!полесчетчика

'или

rs.AddNew
...
rs.Update
rs.Bookmark = rs.LastModified
переменная = rs!полесчетчика


A2: Более широкий круг применимости у такого способа:

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
CurrentProject.Connection.Execute "INSERT ..."
rs.Open "SELECT @@identity as cou", CurrentProject.Connection
переменная = rs!cou
rs.Close
26 vbh
 
11.05.12
13:27
(24) да видимо его надо генерировать какой то функцией или методом...курю...
27 shuhard
 
11.05.12
13:28
(25) +1
фаг конечно по Access
но возможно годиться и для Oracle
28 vbh
 
11.05.12
13:58
вот что нашел в документации по ADODB
Когда вы заносите в таблицу запись, то необходимо создать уникальный ID записи. Существует 2 общих способа: 1) auto-increment колонки, 2) последовательности.
Auto-increment колонки поддерживаются MySQL, Sybase и Microsoft Access и SQL Server. Однако большинство других баз не поддерживают такую возможность. Отсюда видно, что для создания переносимого кода у вас не такой большой выбор, а именно – использовать последовательности. Последовательности – это специальные функции, которые возвращают уникальное число каждый раз, когда вы к ним обращаетесь. Эти числа вполне подходят для использования в качестве уникальных ключей. В ADODB мы используем функцию GenId(). В качестве параметра она принимает название последовательности. Различные таблицы могут иметь разные последовательности.
http://php.russofile.ru/ru/translate/sql/adodb03/#0102
29 shuhard
 
11.05.12
14:01
(28) GenId()- это php функция
30 vbh
 
11.05.12
14:03
(29) да
31 vbh
 
11.05.12
14:05
тему закрываю дальше с id сам разберусь.  shuhard - СПАСИБО за помошь!
32 shuhard
 
11.05.12
14:05
(30) попробуй записать что-нибудь в id, вдруг у него есть триггер
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн