Имя: Пароль:
1C
1С v8
ADO Excel, пакетный INSERT
0 decdmb
 
18.01.12
09:19
Пытаюсь сделать запись в excel через ADO:

   СтрокаПодключения = "
       |Provider=Microsoft.Jet.OLEDB.4.0;
       |Data Source=" + ИмяФайла + ";
       |Extended Properties=""Excel 8.0;HDR=No;"";";
   
   // Создаем объект ADOX.Catalog
   Catalog = Новый COMОбъект("ADOX.Catalog");
   Catalog.ActiveConnection = СтрокаПодключения;
   
   // Создаем таблицу и добавляем в неё столбцы
   Table = Новый COMОбъект("ADOX.Table");
   Table.Name = "Table";

   Table.Columns.Append("col1");
   Table.Columns.Append("col2");
   // Присоединяем таблицу
   Catalog.Tables.Append(Table);
   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Open(СтрокаПодключения);
   Command = Новый COMОбъект("ADODB.Command");
   Command.ActiveConnection = Connection;
   Command.CommandType = 1;
//////////
   Command.CommandText = "INSERT INTO [Table] VALUES('1', 'aaaa');
                           |INSERT INTO [Table] VALUES('2', 'bbbb');" ;
   Command.Execute();
   Connection.Close();

С одним INSERT за вызов Execute() все работает.
Если в command пишу 2 подряд INSERTа то вылетает ошибка:
  Произошла исключительная ситуация (Microsoft JET Database Engine): Обнаружены символы за пределами инструкции SQL.
Находил вариант, что запрос необходимо помещать между BEGIN ... END;
При таком раскладе вылетает ошибка: {Форма.Форма.Форма(143)}: Ошибка при вызове метода контекста (Execute)
   Command.Execute();    
по причине:
Произошла исключительная ситуация (0x80004005)
1 DCKiller
 
18.01.12
09:21
А мож в конце текста последнее ";" - того?.. лишнее? Не?
2 decdmb
 
18.01.12
09:23
(1) Ты имеешь ввиду после 2-го insert ;? если убрать то первая ошибка вылетает
3 decdmb
 
18.01.12
09:36
up...
4 shuhard
 
18.01.12
09:36
(0) будь скромнее,
используй метод ADDNEW рекосрдсета
5 Ковычки
 
18.01.12
09:54
ограничения джета
6 decdmb
 
18.01.12
20:35
(4) А как в Recordset добавить несколько записей?
Пробую так:

   recSet.Open("[Table]", Connection, 2, 4, 2);

   recSet.AddNew();
   recSet.Fields(0).Value = "1";
   recSet.Fields(1).Value = "aaaa";    
   
   recSet.AddNew();
   recSet.Fields(0).Value = "2";
   recSet.Fields(1).Value = "bbbb";
   
   recSet.UpdateBatch(3);

На 2ом AddNew вылетает:

{Форма.Форма.Форма(175)}: Ошибка при вызове метода контекста (AddNew)
   recSet.AddNew();
по причине:
Произошла исключительная ситуация (Provider): Число строк с отложенными изменениями превышает предельно допустимое.
7 ilya_i
 
18.01.12
20:43
Есть еще COMSAFEARRAY
8 decdmb
 
19.01.12
08:24
(7) Там почти то же самое как и на прямую через COMОбъект("Excel.Application"). А хочется без этого объекта и побыстрее
9 Паучог
 
19.01.12
08:40
А если в (0) после VALUES перечислять пары значений, а не несколькими INSERTами пользоваться?
VALUES('1', 'aaaa'),('2', 'bbbb')
10 decdmb
 
19.01.12
08:59
(9)
Количество = 0
{Форма.Форма.Форма(155)}: Ошибка при вызове метода контекста (Execute)
   Command.Execute();
по причине:
Произошла исключительная ситуация (Microsoft JET Database Engine): Пропущен символ (;) в конце инструкции SQL.
Ставлю в конце запроса ";" - ошибка та же.
11 Ковычки
 
19.01.12
09:01
(9) такой синтаксис у мускуля, но не у джета
12 Паучог
 
19.01.12
09:08
(6) у RecordSet'а какие параметры установлены, после Новый COMОбъект?
13 Паучог
 
19.01.12
09:10
к (12). Вижу.. в Open установлены.
14 decdmb
 
19.01.12
09:17
(12)

Выражение    Значение
recSet    COMОбъект
AbsolutePage    Ошибка чтения значения
AbsolutePosition    Ошибка чтения значения
ActiveCommand    
ActiveConnection    
BOF    Ошибка чтения значения
Bookmark    Ошибка чтения значения
CacheSize    100
CursorLocation    2
CursorType    2
DataMember    ""
DataSource    COMОбъект
EOF    Ошибка чтения значения
EditMode    Ошибка чтения значения
Fields    COMОбъект
Filter    0
Index    ""
LockType    4
MarshalOptions    0
MaxRecords    0
PageCount    Ошибка чтения значения
PageSize    10
Properties    COMОбъект
RecordCount    Ошибка чтения значения
Sort    ""
Source    ""
State    0
Status    Ошибка чтения значения
StayInSync    Истина
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой