Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Не получается выполнить параметризированный запрос (число прочтений - 3542 )
Pelmen
Full Member
***
Отсутствует



Сообщений: 242
Зарегистрирован: 01. Июня 2006
Пол: Мужской
Не получается выполнить параметризированный запрос
24. Июля 2008 :: 07:13
Печать  
код примерно такой:
Код
Выбрать все
	л_Команда = СоздатьОбъект("ADODB.Command");
	л_Команда.ActiveConnection = л_Соединение;
	л_Команда.NamedParameters = 1;
	л_Команда.CommandText = "SELECT [id] FROM [dbo].[sc1](NOLOCK) WHERE [sp2] = @id";
	л_Команда.Parameters.Append(л_Команда.CreateParameter("@id", 200, 1, 9));
	л_Команда.Parameters.Item(0).Value = "25";
	л_НаборЗаписей = л_Команда.Execute();      
 



Выдает "Microsoft OLE DB Provider for SQL Server: Must declare the variable '@id'"
без @ в имени создаю параметр - то же самое
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #1 - 24. Июля 2008 :: 07:59
Печать  
А если
Код
Выбрать все
л_Команда.CommandText = "SELECT [id] FROM [dbo].[sc1](NOLOCK) WHERE [sp2] = ?"; 

?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Pelmen
Full Member
***
Отсутствует



Сообщений: 242
Зарегистрирован: 01. Июня 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #2 - 24. Июля 2008 :: 08:00
Печать  
berezdetsky писал(а) 24. Июля 2008 :: 07:59:
А если
Код
Выбрать все
л_Команда.CommandText = "SELECT [id] FROM [dbo].[sc1](NOLOCK) WHERE [sp2] = ?"; 

?

и тогда без имени?
сейчас попробую
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #3 - 24. Июля 2008 :: 08:10
Печать  
Pelmen писал(а) 24. Июля 2008 :: 08:00:
и тогда без имени?

Зачем же без имени?  Озадачен
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Pelmen
Full Member
***
Отсутствует



Сообщений: 242
Зарегистрирован: 01. Июня 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #4 - 24. Июля 2008 :: 08:51
Печать  
спасибо, помогло  Улыбка
по поводу имени, зачем добавлять именованный параметр, если мы не указываем его имени в запросе?
получилось примерно так:
Код
Выбрать все
	л_Команда = СоздатьОбъект("ADODB.Command");
	л_Команда.ActiveConnection = л_Соединение;
	//л_Команда.NamedParameters = 1;
	л_Команда.CommandText = "SELECT [id] FROM [dbo].[sc1](NOLOCK) WHERE [sp2] = ?";
	л_Команда.Parameters.Append(л_Команда.CreateParameter(, 200, 1, 9));
	л_Команда.Parameters.Item(0).Value = "25";
	л_НаборЗаписей = л_Команда.Execute(); 



Интересно, а как в запросе указать именованный параметр?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #5 - 24. Июля 2008 :: 09:04
Печать  
Pelmen писал(а) 24. Июля 2008 :: 08:51:
Интересно, а как в запросе указать именованный параметр?

Сложный вопрос, учитывая, что "Names do not have to be unique within a collection".  Ужас

OFF: там ещё

л_Команда.Prepared = -1;

напрашивается.  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Pelmen
Full Member
***
Отсутствует



Сообщений: 242
Зарегистрирован: 01. Июня 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #6 - 24. Июля 2008 :: 09:07
Печать  
ага, спасибо
не вчитался в доку просто Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #7 - 24. Июля 2008 :: 10:12
Печать  
О! Иван, как в тему! только понадобилось на адо сделать такие запросы  Очень довольный
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #8 - 24. Июля 2008 :: 23:18
Печать  
Pelmen писал(а) 24. Июля 2008 :: 08:51:
Интересно, а как в запросе указать именованный параметр?


Укажем. Только пойдем чуть другим путем:
Кусок из vbs
Код
Выбрать все
Command.CommandType = 4 ' тип adCmdStoredProc
Command.CommandText = "sp_executesql" ' Имя ХП
Query = "IF EXISTS " & vbCr _
  & " (SELECT * FROM [IRP].[dbo].Samsung_models WHERE MODEL = @MODEL) UPDATE [IRP].[dbo].Samsung_models
SET TYPE = @TYPE, MODEL = @MODEL, TYPENAME = @TYPENAME WHERE MODEL = @MODEL " & vbCr _
  & " ELSE INSERT INTO [IRP].[dbo].Samsung_models (TYPE, MODEL, TYPENAME) VALUES (@TYPE, @MODEL, @TYPENAME)"

Command.Parameters.Append Command.CreateParameter("@stmt", 202, 1, 4000, Query)
'параметр обязателен. На 200 ругалось, пришлось ставить 202
Command.Parameters.Append Command.CreateParameter("@params", 202, 1, 4000, "@TYPE varchar(10), @MODEL varchar(30), @TYPENAME varchar(50)")
'параметр обязателен, внутри объявить переменные

Command.Parameters.Append Command.CreateParameter("@TYPE", 202, 1, 10, "")
Command.Parameters.Append Command.CreateParameter("@MODEL", 202, 1, 30, "")
Command.Parameters.Append Command.CreateParameter("@TYPENAME", 202, 1, 50, "")

Command.Parameters.Item("@TYPE").Value = Value1
Command.Parameters.Item("@MODEL").Value = Value2
Command.Parameters.Item("@TYPENAME").Value = Value3
 



Чем мы хуже 1С-ки, чтоб забыть про sp_executesql?  Подмигивание
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #9 - 24. Июля 2008 :: 23:43
Печать  
Вот так будет даже красивше Улыбка

Код
Выбрать все
Query = "IF EXISTS " & vbCr _
  & " (SELECT * FROM [IRP].[dbo].Samsung_models WHERE MODEL = @MODEL) UPDATE [IRP].[dbo].Samsung_models
SET TYPE = @TYPE, MODEL = @MODEL, TYPENAME = @TYPENAME WHERE MODEL = @MODEL " & vbCr _
  & " ELSE INSERT INTO [IRP].[dbo].Samsung_models (TYPE, MODEL, TYPENAME) VALUES (@TYPE, @MODEL, @TYPENAME)"

With Command
  .CommandType = 4 ' тип adCmdStoredProc
  .CommandText = "sp_executesql"
  .Parameters.Append Command.CreateParameter("@stmt", 202, 1, 4000, Query)
  .Parameters.Append Command.CreateParameter("@params", 202, 1, 4000, "@TYPE varchar(10), @MODEL varchar(30), @TYPENAME varchar(50)")
  .Parameters.Append Command.CreateParameter("@TYPE", 202, 1, 10, "")
  .Parameters.Append Command.CreateParameter("@MODEL", 202, 1, 30, "")
  .Parameters.Append Command.CreateParameter("@TYPENAME", 202, 1, 50, "")

  .Parameters.Item("@TYPE").Value = Value1
  .Parameters.Item("@MODEL").Value = Value2
  .Parameters.Item("@TYPENAME").Value = Value3
End With 


  
Наверх
 
IP записан
 
Pelmen
Full Member
***
Отсутствует



Сообщений: 242
Зарегистрирован: 01. Июня 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #10 - 25. Июля 2008 :: 02:55
Печать  
спасибо  Улыбка
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #11 - 25. Июля 2008 :: 09:39
Печать  
Arta писал(а) 24. Июля 2008 :: 23:18:
Чем мы хуже 1С-ки, чтоб забыть про sp_executesql?  Подмигивание

Гулять, так гулять!  Смех
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не получается выполнить параметризированный за
Ответ #12 - 25. Июля 2008 :: 11:45
Печать  
Идрить... я и забыл про нее.

Усе, сегодня точно добью!


Повторно сенкс! Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать