Имя: Пароль:
1C
1С v8
Помогите передать параметры в запрос при подключении по ADO
0 VladSt
 
11.09.12
09:37
Подключаюсь к IBProvider, Connection работает, активное соединение Command тоже работает.
Если строка без условия WHERE: Command.CommandText = "SELECT * FROM ARCHREQS";
тогда дальше все работает, если делаю с условием WHERE - ошибка:
Ошибка при вызове метода контекста (CreateParameter): Произошла исключительная ситуация (ADODB.Command): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом. Parameter = Command.CreateParameter("DATEIN", 1,1, ,DATEIN);
Подскажите, где не прав.

Вот код:

   стрПодключения = "data source=" + Сервер + ":" + МестоНахождениеБД + ";" + ПараметрыПодключения + ";user ID=" + ИмяПользователя + ";password=" + ПарольПользователя;
   
   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Provider = "LCPI.IBProvider";
   Connection.ConnectionString =  стрПодключения;
   
   попытка
       Connection.Open();
       Сообщить ("Соединение установленно" );
   исключение
       //Сообщить ("Проблемы с подключением к IBProvider" );
       Сообщить(ОписаниеОшибки() ) ;
       Возврат;
   КонецПопытки;
   
   // Создание объекта выполнения команды
   Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения
   Command.ActiveConnection = Connection;
   
   // Определение текста команды
   DATEIN = Дата("20120907");
   IdNom = 48000;
   //Command.CommandText = "SELECT * FROM ARCHREQS WHERE id > :IdNom";
   Command.CommandText = "SELECT * FROM ARCHREQS WHERE (id > :IdNom) and (DATEIN > :DateIn)";
   // Определение типа команды
   Command.CommandType = 4;
   // Создание объекта набора записей
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   
   Parameter = Command.CreateParameter("IdNom", 14,1, 5,IdNom);
   Parameter = Command.CreateParameter("DATEIN", 1,1, ,DATEIN);
   // Добавление в семейство Parameters объекта Command нового параметра
   Command.Parameters.Append(Parameter);    
   // Выполнение и получение набора данных
   RecordSet = Command.Execute();
1 shuhard
 
11.09.12
09:46
(0) не используй параметры
склей строку запросу и не забудь преобразовать дату к виду #2012/12/31#
2 VladSt
 
11.09.12
09:55
(1) Сделал так:
   Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > #2012/09/01#";
   Command.CommandType = 4;
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   RecordSet = Command.Execute();

Итог ошибка:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (LCPI.IBProvider.3.Lite): Ошибка подготовки SQL выражения.
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 1
exec
RecordSet = Command.Execute();
3 vde69
 
11.09.12
10:00
что говорит файлик "adojavas.inc" ???? типы соответствуют?
4 VladSt
 
11.09.12
10:07
(3) что за файлик такой, где его найти?
во втором случае случае в запрос передается только текст запроса, без параметров и типов.
Кстати, правильно ли передалось в тексте запроса условие: WHERE DATEIN > #2012/09/01# ???
Если бы это сработало, то и этого бы хватило на худой конец, но :(
5 vde69
 
11.09.12
10:08
C:\Program Files\Common Files\System\ado
6 vde69
 
11.09.12
10:18
типы

Const adEmpty = 0
Const adTinyInt = 16
Const adSmallInt = 2
Const adInteger = 3
Const adBigInt = 20
Const adUnsignedTinyInt = 17
Const adUnsignedSmallInt = 18
Const adUnsignedInt = 19
Const adUnsignedBigInt = 21
Const adSingle = 4
Const adDouble = 5
Const adCurrency = 6
Const adDecimal = 14
Const adNumeric = 131
Const adBoolean = 11
Const adError = 10
Const adUserDefined = 132
Const adVariant = 12
Const adIDispatch = 9
Const adIUnknown = 13
Const adGUID = 72
Const adDate = 7
Const adDBDate = 133
Const adDBTime = 134
Const adDBTimeStamp = 135
Const adBSTR = 8
Const adChar = 129
Const adVarChar = 200
Const adLongVarChar = 201
Const adWChar = 130
Const adVarWChar = 202
Const adLongVarWChar = 203
Const adBinary = 128
Const adVarBinary = 204
Const adLongVarBinary = 205
Const adChapter = 136
Const adFileTime = 64
Const adPropVariant = 138
Const adVarNumeric = 139
Const adArray = &H2000
7 VladSt
 
11.09.12
10:34
(6) Спасибо, конечно, почитал. Типы еще в первом моем варианте, когда я устанавливал параметры:
Parameter = Command.CreateParameter("DATEIN", 7,1, ,DATEIN);
так тоже не работает
8 VladSt
 
11.09.12
10:55
Упрощаю задачу до:
Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > #2012/09/01#";
Как правильно поставить условие с датой?
9 shuhard
 
11.09.12
10:59
(8) обычно формат литерала указан в мануалах по СУБД
10 VladSt
 
11.09.12
11:49
(9) строка: Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > #2012/09/01#";
не работает
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (LCPI.IBProvider.3.Lite): Ошибка подготовки SQL выражения.
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 1
exec    RecordSet = Command.Execute();
11 shuhard
 
11.09.12
11:58
(10) ссылку на мануал в студию
12 VladSt
 
11.09.12
12:11
(11) не понял, какую ссылку?
13 shuhard
 
11.09.12
12:18
(12) на мануал, в котором ты для своей СУБД, нашёл литерал даты  ##
14 ZoRN
 
11.09.12
12:24
это FireBird, там с датами сложно :)
15 ZoRN
 
11.09.12
12:26
cast('2007-11-03' as timestamp)
16 VladSt
 
11.09.12
12:26
(13) Где-то нашел, теперь уже не могу найти ссылку. А как правильно?
17 VladSt
 
11.09.12
12:30
(15) чтобы это значило?
Тоже не работает :(
18 Bugmenot
 
11.09.12
12:32
Так и не смог заставить работать ADODB с именованными параметрами, в итоге использовал неименованные. Для твоего случая запрос будет такой:
Command.CommandText = "SELECT * FROM ARCHREQS WHERE (id > ?) and (DATEIN > ?)";
...
   Parameter = Command.CreateParameter("IdNom", 5,1);
   Parameter = Command.CreateParameter("DATEIN", 7,1);
19 Bugmenot
 
11.09.12
12:36
Можно подставлять дату в запрос. Формат даты строго фиксирован и выглядит так:
{d'гггг-мм-дд'}
20 VladSt
 
11.09.12
12:44
(19) Так:
Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > {d'2012-09-01'}";
Увы, но тоже не работает
21 VladSt
 
11.09.12
12:46
(18) а когда программа узнает, какие значения какие параметры в запросе я передаю?
22 rool
 
11.09.12
12:49
мой работающий вариант подключения:

Connection = new COMОбъект("ADODB.Connection");
   Connection.Provider = "LCPI.IBProvider";
   Connection.ConnectionString = ConStr;
   Connection.Mode = 1;
   Connection.Open();
   Connection.BeginTrans();
   
   Command = new COMОбъект("ADODB.Command");
   Command.ActiveConnection = Connection;
   Command.CommandText =   "SELECT
                           |    D.Id_Doc    AS DocumentID,
                           |    D.DocNum    AS DocumentNumber,
                           |    S1.Name    AS ContractorName,
                           |   S1.Id_Pred    AS ContractorID,
                           |    D.Sotr_Name AS EmployeeName,
                           |    D.Count_Izd AS ProductionsCount
                           |FROM
                           |    Doc_Acc_Zag D
                           |        INNER JOIN spr_pred S1 ON D.Id_Pred = S1.Id_Pred
                           |WHERE
                           |    D.DocDate >= ? AND D.DocDate <= ?
                           |ORDER BY DocNum";
   
   Param1 = Command.CreateParameter("Date1", 133, 1);
   Command.Parameters.Append(Param1);
   Param1.Value = Формат(ДатаНач, "ДФ=dd.MM.yyyy");
   
   Param2 = Command.CreateParameter("Date2", 133, 1);
   Command.Parameters.Append(Param2);
   Param2.Value = Формат(ДатаКон, "ДФ=dd.MM.yyyy");
   
   Recordset = Новый COMОбъект("ADODB.Recordset");
   Recordset = Command.Execute();
23 Bugmenot
 
11.09.12
13:08
(21) В порядке добавления параметров.
24 Bugmenot
 
11.09.12
13:13
(20) Может DATEIN вовсе и не дата?
25 VladSt
 
11.09.12
13:23
Ребята и девчата :) :)  :)
Спасибо всем большое за помощь! Особое большое спасибо rool и его сообщению (22)
Все работает уже и у меня:

   Connection = Новый COMОбъект("ADODB.Connection");
   Connection.Provider = "LCPI.IBProvider";
   Connection.ConnectionString =  стрПодключения;
   
   Connection.Mode = 1;
   
   попытка
       Connection.Open();
       Сообщить ("Соединение установленно" );
   исключение
       //Сообщить ("Проблемы с подключением к IBProvider" );
       Сообщить(ОписаниеОшибки() ) ;
       Возврат;
   КонецПопытки;
   
   Connection.BeginTrans();
   
   // Создание объекта выполнения команды
   Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения
   Command.ActiveConnection = Connection;
   
   // Определение текста команды
   Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > ? AND id > ? ORDER BY id";
   
   DATEIN = Дата("20120901");
   IdNom = 48000;
   
   Param1 = Command.CreateParameter("DateIn", 133, 1);
   Command.Parameters.Append(Param1);
   Param1.Value = Формат(DateIn, "ДФ=dd.MM.yyyy");
   
   Param2 = Command.CreateParameter("IdNom", 14, 1);
   Command.Parameters.Append(Param2);
   Param2.Value = IdNom;
   
   // Определение типа команды
   //Command.CommandType = 4;
   // Создание объекта набора записей
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   RecordSet = Command.Execute();
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн