|
Помогите передать параметры в запрос при подключении по 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(); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |