Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите передать параметры в запрос при подключении по ADO

Помогите передать параметры в запрос при подключении по ADO
Я
   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();
   shuhard
 
1 - 11.09.12 - 09:46
(0) не используй параметры
склей строку запросу и не забудь преобразовать дату к виду #2012/12/31#
   VladSt
 
2 - 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();
   vde69
 
3 - 11.09.12 - 10:00
что говорит файлик "adojavas.inc" ???? типы соответствуют?
   VladSt
 
4 - 11.09.12 - 10:07
(3) что за файлик такой, где его найти?
во втором случае случае в запрос передается только текст запроса, без параметров и типов.
Кстати, правильно ли передалось в тексте запроса условие: WHERE DATEIN > #2012/09/01# ???
Если бы это сработало, то и этого бы хватило на худой конец, но :(
   vde69
 
5 - 11.09.12 - 10:08
C:\Program Files\Common Files\System\ado
   vde69
 
6 - 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
   VladSt
 
7 - 11.09.12 - 10:34
(6) Спасибо, конечно, почитал. Типы еще в первом моем варианте, когда я устанавливал параметры:
Parameter = Command.CreateParameter("DATEIN", 7,1, ,DATEIN);
так тоже не работает
   VladSt
 
8 - 11.09.12 - 10:55
Упрощаю задачу до:
Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > #2012/09/01#";
Как правильно поставить условие с датой?
   shuhard
 
9 - 11.09.12 - 10:59
(8) обычно формат литерала указан в мануалах по СУБД
   VladSt
 
10 - 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();
   shuhard
 
11 - 11.09.12 - 11:58
(10) ссылку на мануал в студию
   VladSt
 
12 - 11.09.12 - 12:11
(11) не понял, какую ссылку?
   shuhard
 
13 - 11.09.12 - 12:18
(12) на мануал, в котором ты для своей СУБД, нашёл литерал даты  ##
   ZoRN
 
14 - 11.09.12 - 12:24
это FireBird, там с датами сложно :)
   ZoRN
 
15 - 11.09.12 - 12:26
cast('2007-11-03' as timestamp)
   VladSt
 
16 - 11.09.12 - 12:26
(13) Где-то нашел, теперь уже не могу найти ссылку. А как правильно?
   VladSt
 
17 - 11.09.12 - 12:30
(15) чтобы это значило?
Тоже не работает :(
   Bugmenot
 
18 - 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);
   Bugmenot
 
19 - 11.09.12 - 12:36
Можно подставлять дату в запрос. Формат даты строго фиксирован и выглядит так:
{d'гггг-мм-дд'}
   VladSt
 
20 - 11.09.12 - 12:44
(19) Так:
Command.CommandText = "SELECT * FROM ARCHREQS WHERE DATEIN > {d'2012-09-01'}";
Увы, но тоже не работает
   VladSt
 
21 - 11.09.12 - 12:46
(18) а когда программа узнает, какие значения какие параметры в запросе я передаю?
   rool
 
22 - 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();
   Bugmenot
 
23 - 11.09.12 - 13:08
(21) В порядке добавления параметров.
   Bugmenot
 
24 - 11.09.12 - 13:13
(20) Может DATEIN вовсе и не дата?
   VladSt
 
25 - 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();


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.