Имя: Пароль:
IT
 
Ado, SQL, параметризованный запрос, как заполнить параметр?
0 NcSteel
 
30.05.11
13:55
СтрокаЗапроса = "select * from table Where parametr = @parametr";

Command.CommandText = СтрокаЗапроса;
       
SqlParameters = Command.Parameters.refresh();
1 Жан Пердежон
 
30.05.11
13:55
мде
2 NcSteel
 
30.05.11
13:56
(0) + Вроде как refresh должен обновить параметры , судя по МСДН
3 NcSteel
 
30.05.11
13:56
(1) Куды капать ?
4 NcSteel
 
30.05.11
13:56
(2) +

Using the Refresh method on a Command object's Parameters collection retrieves provider parameter information for the stored procedure or parameterized query specified in the Command object.
5 NcSteel
 
30.05.11
13:57
(4)  + "parameterized query" не мой случай (1) ??
6 ado
 
30.05.11
13:58
7 marty0701
 
30.05.11
14:04
(0) А CreateParametr и Append не подходят? я просто понят не могу, что значит заполнить параметр? Выполнить нужно запрос с параметрами?
8 NcSteel
 
30.05.11
14:21
(7) Агу.
9 Ёпрст
 
гуру
30.05.11
14:22
а обязательно именно адо юзать ?
10 smaharbA
 
30.05.11
14:24
Команда.CommandText=Стр;
       Параметры.Append(Команда.CreateParameter(,3,1,4,Кол));
       //Параметры.Append(Команда.CreateParameter(,129,1,6,ВидИД));
       //Параметры.Append(Команда.CreateParameter(,129,1,6,ДокИД));
       Параметры.Append(Команда.CreateParameter(,3,1,4,ВидИД));
       Параметры.Append(Команда.CreateParameter(,3,1,4,ДокИД));
       Параметры.Append(Команда.CreateParameter(,129,1,23,ДатаНач));
       Параметры.Append(Команда.CreateParameter(,129,1,23,ДатаКон));
       Параметры.Append(Команда.CreateParameter(,200,1,255,Виды));
       Параметры.Append(Команда.CreateParameter(,3,1,4,Реж));
       Сообщить("Запрос подготовлен");
   Иначе
       Параметры.Item(0).Value=Кол;
       Параметры.Item(1).Value=ВидИД;
       Параметры.Item(2).Value=ДокИД;
       Параметры.Item(3).Value=ДатаНач;
       Параметры.Item(4).Value=ДатаКон;
       Параметры.Item(5).Value=Виды;
       Параметры.Item(6).Value=Реж;
   КонецЕсли;
11 marty0701
 
30.05.11
14:25
http://www.1c sql.ru/materials/articles/develop.html~bfd0f58f-25af-add2-6767-09a5bf664605
Надеюсь не забанят, там вполне доступно описано все, что вам требуется.
12 smaharbA
 
30.05.11
14:25
параметры вопросом в порядке либо в строке параметров по сабаке
13 NcSteel
 
30.05.11
14:32
(9) Нет необязательно. Получать данные не буду , необходимо выполнить скрипт с БД (insert, update)
14 NcSteel
 
30.05.11
14:33
(12) А нельзя ли именовать параметр? Например @parametr1, @parametr2?
15 Ёпрст
 
гуру
30.05.11
14:34
(13)дык проще через вк делать, чем через адо, если это в 1с-ине выполнятся будет..
16 marty0701
 
30.05.11
14:34
(14)CreateParameter (name,type,direction,size,value)
1ый параметр. Окай.
17 NcSteel
 
30.05.11
14:36
(15) Да в 1с-ине , но с вк не дружу. С начала скуль подучу , потом и до C# оберусь
18 Ёпрст
 
гуру
30.05.11
14:37
(17) дык проще тогда через 1cpp всё слепить.
19 NcSteel
 
30.05.11
14:38
Соединение = Соединиться(СтрокаПодключения);
СтрокаЗапроса = "select * from Abonent Where k_abon = @k_abon";

Command = Соединение[3];
       RecordSet = Соединение[4];
       
       Command.CommandText = СтрокаЗапроса;
       
       prm1 = Command.CreateParameter("@k_abon", КонстантаАДО("adWChar"),
       ТипПараметраАДО("adParamInput"), 9, 9);  
       Command.Parameters.Append( prm1 );  
       RecordSet = Command.Execute();

Ошибка:

select * from Abonent Where k_abon = @k_abon // {Форма.Форма.Форма(29)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the scalar variable "@k_abon".
20 NcSteel
 
30.05.11
14:38
(18) Ща прикинем .
21 marty0701
 
30.05.11
14:52
(19) adWChar    130    A null-terminated Unicode character string. - Похоже на число?
http://www.w3 schools.com/ado/met_comm_createparameter.asp
Параметры расписаны.
22 smaharbA
 
30.05.11
14:54
в имени параметра не нужна собака когда его создаешь, можно просче, в запросе типа

|SET @ВидИД=RIGHT(dbo._IdToStr(?),4)
|SET @ДокИД=dbo._IdToStr(?)
|SET @ДатаНач=?
|SET @ДатаКон=?
|SET @Виды=REPLACE(REPLACE(?,' ',''),CHAR(9),'')
|SET @РежимОтбора=?
|SET @Режим=ABS(@РежимОтбора)
|SET @КоличествоАбсолютное=ABS(@Количество)
23 NcSteel
 
30.05.11
15:02
(22) Получается именовать параметр нельзя. Параметры определяются через порядок появления в скрипте.
24 NcSteel
 
30.05.11
15:03
(21) Если

СтрокаЗапроса = "select * from Abonent Where k_abon = ?";
и
prm1 = Command.CreateParameter(, КонстантаАДО("adWChar"),
       ТипПараметраАДО("adParamInput"), 9, 9);

То отрабатывает без ошибки . Но имя параметра не задается и Объектной структуры нет.
25 NcSteel
 
30.05.11
15:08
Еще вопрос , как я понимаю четвертый параметр функции CreateParameter() это выделяемая память. размер зависит от передаваемого параметра ? Тоесть для int или image разный размер необходимо ставить ?
26 NcSteel
 
30.05.11
15:15
СтрокаЗапроса = "
|declare @k_abon as int
|set @k_abon = ?
|select * from Abonent Where k_abon = @k_abon";

Command = Соединение[3];
RecordSet = Соединение[4];
       
Command.CommandText = СтрокаЗапроса;
       
prm1 = Command.CreateParameter(, КонстантаАДО("adInteger"),
       ТипПараметраАДО("adParamInput"), , 8);  
       Command.Parameters.Append( prm1 );  
       RecordSet = Command.Execute();

Так отработало.
27 КонецЦикла
 
30.05.11
15:22
Типизировать тоже сам будешь если придется не абонентов вызывать а, к примеру, контрагентов? :)
Нафига этот гимор? Можно пробежать по диагонали десяток страниц и юзать нормальные инструменты
28 NcSteel
 
30.05.11
15:43
(27) Например какой инструмент?

Уже гемор почти написал .
29 smaharbA
 
30.05.11
16:03

//-------------------------------------------------------------------------
Функция глПолучитьСтрокуСоединения(Файл="") Экспорт
   Перем КодSQL[36], КодСтр[200],Сп,Стр,ДлинаСтр;
   Если ФС.СуществуетФайл(Файл)=0 Тогда
       Файл = КаталогИБ() + "1Cv7.DBA";
   КонецЕсли;
   Если ФС.СуществуетФайл(Файл)=0 Тогда
       Сообщить("Это не SQL - база!", "!");
       Возврат 0;
   КонецЕсли;
   ФСО = СоздатьОбъект("Scripting.FileSystemObject");
   Файл = ФСО.OpenTextFile(Файл, 1);
   ДлинаСтр = 0;
   Пока Файл.AtEndOfStream = 0 Цикл
       ДлинаСтр = ДлинаСтр + 1;
       КодСтр[ДлинаСтр] = КодСимв(Файл.Read(1));
   КонецЦикла;
   Файл.Close();
   ФСО = 0;
   КлючSQL = "19465912879oiuxc ensdfaiuo3i73798kjl";
   Для Сч=1 По 36 Цикл
       КодSQL[Сч] = КодСимв(Сред(КлючSQL, Сч));
   КонецЦикла;
   Стр = "";
   Для Сч=1 По ДлинаСтр Цикл
       А=КодСтр[Сч];
       Б=КодSQL[(Сч - 1) % 36 + 1];
       Код = 0;
       Коэфф = 1;
       Пока Коэфф < 256 Цикл
           Код = Код + (А + Б) % 2 * Коэфф;
           А = Цел(А / 2);
           Б = Цел(Б / 2);
           Коэфф = Коэфф * 2;
       КонецЦикла;
       Стр = Стр + Симв(Код);
   КонецЦикла;
   Стр=Сред(Стр,3);
   Стр=Лев(Стр,СтрДлина(Стр)-2);
   Стр=СтрЗаменить(Стр,"""""},{""""","" "");
   Стр=СтрЗаменить(Стр,"""},{""",""",""");
   Стр=СтрЗаменить(Стр,"" "","""""},{""""");
   Сп=СоздатьОбъект("СписокЗначений");
   Сп.ИзСтрокиСРазделителями(Стр);
   Стр=Сп.ПолучитьЗначение(2);
   Основной=Найти(Стр,";");
   Если Основной=0 Тогда
       Сп.УстановитьЗначение(2,Стр,"Сервер");
   Иначе
       Сп.УстановитьЗначение(2,СокрЛП(Лев(Стр,Основной-1)),"Сервер");
   КонецЕсли;
   Сп.УстановитьЗначение(4,Сп.ПолучитьЗначение(4),"База");
   Сп.УстановитьЗначение(6,Сп.ПолучитьЗначение(6),"Пользователь");
   Сп.УстановитьЗначение(8,Сп.ПолучитьЗначение(8),"Пароль");
   Сп.УстановитьЗначение(10,Сп.ПолучитьЗначение(10),"Контрольная сумма");
   Сп.ДобавитьЗначение(Сред(Стр,Основной),"Дополнительные параметры");
   Возврат Сп;
КонецФункции    // глПолучитьСтрокуСоединения()

//-------------------------------------------------------------------------
Функция глПолучитьЗапросSQL(Парам="",Провайдер="",Сервер="",База="",Пользователь="",Пароль="") Экспорт
   Перем Сп,Стр;
   Нач=_GetPerformanceCounter();
   Соединение=СоздатьОбъект("ADODB.Connection");
   Если ПустоеЗначение(Парам)=1 Тогда
       Сп=глПолучитьСтрокуСоединения();
       Сп.ДобавитьЗначение("SQLOLEDB","Провайдер 1");
       Сп.ДобавитьЗначение("MSDASQL","Провайдер 2");
       //Соединение="provider=MSDASQL;Driver=SQL Server;Server="+СокрЛП(Сп.Получить("Сервер"))+";DataBase="+СокрЛП(Сп.Получить("База"))+";uid="+СокрЛП(Сп.Получить("Пользователь"))+";pwd="+""+СокрЛП(Сп.Получить("Пароль"));
   ИначеЕсли ТипЗначения(Парам)=2 Тогда
       Сп=СоздатьОбъект("СписокЗначений");
       Сп.ДобавитьЗначение(Провайдер,"Провайдер 1");
       Сп.ДобавитьЗначение(Сервер,"Сервер");
       Сп.ДобавитьЗначение(База,"База");
       Сп.ДобавитьЗначение(Пользователь,"Пользователь");
       Сп.ДобавитьЗначение(Пароль,"Пароль");
   Иначе
       Возврат Парам;
   КонецЕсли;
   Соединение.CursorLocation=3;
   Соединение.Provider=Сп.Получить("Провайдер 1");
   Если Врег(Соединение.Provider)="SQLOLEDB" Тогда
       Свойства=Соединение.Properties;
       Свойства.Item("Data Source").Value=Сп.Получить("Сервер");
       Свойства.Item("User ID").Value=Сп.Получить("Пользователь");
       Свойства.Item("Password").Value=Сп.Получить("Пароль");
       Свойства.Item("Initial Catalog").Value=Сп.Получить("База");
       Соединение.Open("Driver=SQL Server;"+Сп.Получить("Дополнительные параметры"));
   Иначе
       Соединение.Open("Driver=SQL Server;Server="+Сп.Получить("Сервер")+";"+Сп.Получить("Дополнительные параметры"),Сп.Получить("Пользователь"),Сп.Получить("Пароль"),-1);
       Соединение.DefaultDatabase=Сп.Получить("База");
   КонецЕсли;
   Команда=СоздатьОбъект("ADODB.Command");
   Команда.CommandText="SET ROWCOUNT 0";
   Команда.ActiveConnection = Соединение;
   Команда.Prepared=-1;
   Запрос=Команда.Execute();
   Сообщить("Соединение с сервером получено за время - "+((_GetPerformanceCounter()-Нач)/1000)+" сек.","I");
   Возврат Запрос;
КонецФункции    // глПолучитьСоединениеSQL
//*******************************************
Процедура Сформировать()
   Запрос = глПолучитьЗапросSQL();
   Попытка
       Команда=Запрос.ActiveCommand;
   Исключение
       Команда=СоздатьОбъект("ADODB.Command");
       Команда.ActiveConnection = Запрос.ActiveConnection;
       Команда.Prepared=-1;
   КонецПопытки;
   Параметры=Команда.Parameters;
   Если Параметры.Count=0 Тогда
       Стр="DECLARE @МОЙПАРАМЕТР varchar(MAX)
       |SET @МОЙПАРАМЕТР = ?
       |SELECT @МОЙПАРАМЕТР";
       Команда.CommandText=Стр;
       Параметры.Append(Команда.CreateParameter("МОЙПАРАМЕТР",200,1,255,"Содержание моего параметра созданного"));
       Сообщить("Запрос подготовлен");
   КонецЕсли;
   Запрос.CursorType=0;
   Запрос.Open();
   Сч=0;
   Если Запрос.EOF=0 Тогда
           Пока Запрос.EOF=0 Цикл
               Для Сч=0 По Запрос.Fields.Count-1 Цикл
                   Сообщить(Запрос.Fields(Сч).Value);
               КонецЦикла;
               Запрос.MoveNext();
           КонецЦикла;
   КонецЕсли;
   Запрос.Close();
   Если Параметры.Count > 0 Тогда
       Параметры.Item("МОЙПАРАМЕТР").Value="Содержание моего параметра имеющегося";
   КонецЕсли;
   Запрос.Open();
   Если Запрос.EOF=0 Тогда
           Пока Запрос.EOF=0 Цикл
               Для Сч=0 По Запрос.Fields.Count-1 Цикл
                   Сообщить(Запрос.Fields(Сч).Value);
               КонецЦикла;
               Запрос.MoveNext();
           КонецЦикла;
   КонецЕсли;
   Запрос.Close();
КонецПроцедуры