Параметрический запрос

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Параметрический запрос

Сообщение sergey-911 » 16.07.2007 (Пн) 18:52

Доброго времени суток уважаемые.
В в одном из топиков
GSerg привёл пример параметрического запроса
Код: Выделить всё

dim c as adodb.command, r as adodb.recordset

set c=new adodb.command
set c.activeconnection = conn
c.commandtype=adcmdtext
c.commandtext="SELECT * FROM [main] WHERE [partNum] Like ? AND [Descr] Like ?"
c.parameters.add c.createparameter("strParam1", advarwchar, adparaminput, 255, strParam1)
c.parameters.add c.createparameter("strParam2", advarwchar, adparaminput, 255, strParam2)

set r=new adodb.recordset
r.open c,,adopenstatic,adlockreadonly

Информация весьмя полезная.
Вот только столкнулся с проблемой, когда икать нужно часть строки, т.е.
Код: Выделить всё

c.commandtext="SELECT * FROM [main] WHERE [partNum] Like '%?%' AND [Descr] Like '%?%'"

Всё перепробовал, не пойму как правильно сформировать параметрический запрос... :(
Код: Выделить всё

dim c as adodb.command, r as adodb.recordset

set c=new adodb.command
set c.activeconnection = conn
c.commandtype=adcmdtext
c.commandtext="SELECT * FROM [main] WHERE [partNum] Like '%?%' AND [Descr] Like '%?%'"
c.parameters.add c.createparameter("strParam1", advarwchar, adparaminput, 255, strParam1)
c.parameters.add c.createparameter("strParam2", advarwchar, adparaminput, 255, strParam2)

set r=new adodb.recordset
r.open c,,adopenstatic,adlockreadonly

- Ничего не возвращает
Код: Выделить всё

dim c as adodb.command, r as adodb.recordset

set c=new adodb.command
set c.activeconnection = conn
c.commandtype=adcmdtext
c.commandtext="SELECT * FROM [main] WHERE [partNum] Like ? AND [Descr] Like ?"
c.parameters.add c.createparameter("strParam1", advarwchar, adparaminput, 255, "'%" & strParam1 & "'%'")
c.parameters.add c.createparameter("strParam2", advarwchar, adparaminput, 255, "'%" & strParam2 & "%'")

set r=new adodb.recordset
r.open c,,adopenstatic,adlockreadonly

-Выдает ошибку.
:(
С уважением, Сергей.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 16.07.2007 (Пн) 19:23

sergey-911 писал(а):-Выдает ошибку.
:(


А какую ошибку выает?
Оператор Like используется типа такого:
Код: Выделить всё
[поле] Like "*пр?"

"*" замещает любую последовательность символов
"?" замещает один любой символ
"[a-z]" - один имвол в диапазоне от "a" до "z"
"[!a-z]" - один имвол вне диапазона от "a" до "z"
Еще по оператору Like можно почитать в Access, введя в поиск "Like"

P. S. GSerg извиняюсь если я не в тему
Последний раз редактировалось burik 16.07.2007 (Пн) 20:46, всего редактировалось 1 раз.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.07.2007 (Пн) 20:04

burik, ты не в теме.

sergey-911, уж конкатенацию строк надо уметь делать, нет?
Like '%'+ ? + '%' AND [Descr] Like '%' + ? + '%'
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 16.07.2007 (Пн) 23:37

GSerg писал(а):sergey-911, уж конкатенацию строк надо уметь делать, нет?
Like '%'+ ? + '%' AND [Descr] Like '%' + ? + '%'

Спасибо GSerg. Но чем твой вариант отличается от моего:
Код: Выделить всё

"SELECT * FROM [main] WHERE [partNum] Like '%?%' AND [Descr] Like '%?%'"

, кроме того, что он работает...:)

Запрос, применимый к программе принял вид:
Код: Выделить всё

"SELECT * FROM vw_Personal WHERE [Код] LIKE '%' + ? + '%' OR [Логин] LIKE '%' + ? + '%' OR [Фамилия] LIKE '%' + ? + '%' OR [Имя] LIKE '%' + ? + '%' OR [Отчество] LIKE '%' + ? + '%' OR [Служба] LIKE '%' + ? + '%' OR [Должность] LIKE '%' + ? + '%' OR [Трудовые отношения] LIKE '%' + ? + '%' OR [Телефон] LIKE '%' + ? + '%' OR [Примечание] LIKE '%' + ? + '%'"

и работает. Почему, только догадываюсь, GSerg, разъясни плиз. И ещё, означает ли символ "?" в запросе параметр?
Спасибо за помощь.:)
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.07.2007 (Вт) 12:51

Ммм... Ты понимаешь, чем в коде программы отличаются varname и "varname"?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 17.07.2007 (Вт) 17:46

GSerg , прошу прощения, не совсем. Я обычно делал так:
Код: Выделить всё

Private Sub Insert()
On Error GoTo Er
   
    Screen.MousePointer = vbHourglass
    Consts.ID = Empty
   
    'Подключение к БД
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.Open (Connect.Soedinenie)
   
    'Параметрический запрос
    'Обработка БД на VB6 стр. 500
    Dim cm As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim P As ADODB.Parameter
   
    'Зоздание и иниализация объекта Recordset
    Set rs = New ADODB.Recordset
    Set rs.ActiveConnection = cn
    'Грид поддерживает только клиентский курсор
    rs.CursorLocation = adUseClient
    rs.LockType = adLockOptimistic
    rs.CursorType = adOpenKeyset
    'Создание объекта ADO command
    Set cm = New ADODB.Command
    Set cm.ActiveConnection = cn
   
    cm.CommandType = adCmdStoredProc
    cm.CommandText = "sp_PersonalIns"
   
    'Определение параметра
    'Обязательные параметры
    Set P = cm.CreateParameter("@ID_Personal", adInteger, adParamOutput, , Null)
    cm.Parameters.Append P  'Указываем первый параметр
    Set P = cm.CreateParameter("@ID_Service", adInteger, adParamInput, , Trim(txtService.Tag))
    cm.Parameters.Append P  'Указываем второй параметр
    Set P = cm.CreateParameter("@ID_Post", adInteger, adParamInput, , Trim(txtPost.Tag))
    cm.Parameters.Append P  'Указываем третий параметр
    Set P = cm.CreateParameter("ID_PersonalStatus", adInteger, adParamInput, , Trim(txtPersonalStatus.Tag))
    cm.Parameters.Append P  'Указываем четвёртый параметр
    Set P = cm.CreateParameter("@Login", adVarChar, adParamInput, 30, Consts.IsNull(txtLogin.Text))
    cm.Parameters.Append P  'Указываем пятый параметр
    Set P = cm.CreateParameter("@LastName", adVarChar, adParamInput, 30, Trim(txtLastName.Text))
    cm.Parameters.Append P  'Указываем шестой параметр
    Set P = cm.CreateParameter("@Name", adVarChar, adParamInput, 30, Trim(txtName.Text))
    cm.Parameters.Append P  'Указываем седьмой параметр
    Set P = cm.CreateParameter("@FirstName", adVarChar, adParamInput, 30, Trim(txtFirstName.Text))
    cm.Parameters.Append P  'Указываем восьмой параметр
    'Не обязательные параметры
    Set P = cm.CreateParameter("@Phone", adVarChar, adParamInput, 250, Consts.IsNull(txtPhone.Text))
    cm.Parameters.Append P  'Указываем девятый параметр
    Set P = cm.CreateParameter("@Prim", adVarChar, adParamInput, 500, Consts.IsNull(txtPrim.Text))
    cm.Parameters.Append P  'Указываем десятый параметр

    'Выполнение команды
    rs.Open cm                  'Вместо "Set rs = cm.Execute", _
    т.к. "cm.Execute" выполняет "SP" на серверном курсоре!
   
    'Находим идентификатор
    Consts.ID = cm.Parameters.Item("@ID_Personal").Value

    Set rs = Nothing            'Обязательно! Иначе - Error 7004!
   
    Screen.MousePointer = vbDefault
   
Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

, где
Код: Выделить всё

CREATE PROCEDURE [sp_PersonalIns]         --Вставка персонала
   (@ID_Personal      [int] = NULL OUTPUT,   --ID_Personal
    @ID_Service      [int],         --Служба
    @ID_Post      [int],         --Должность
    @ID_PersonalStatus   [int],         --[Трудовые отношения]
    @Login      [nvarchar](30) = NULL,   --Логин
    @LastName       [nvarchar](30),      --Фамилия
    @Name       [nvarchar](30),      --Имя
    @FirstName      [nvarchar](30),      --Отчество
    @Phone      [nvarchar](250),      --Телефон
    @Prim         [nvarchar](500))      --Примечание
   

AS

BEGIN TRAN -- Объявляем начало транзакции

INSERT INTO [Personal]
   ([ID_Service],
    [ID_Post],
    [ID_PersonalStatus],
    [Login],
    [LastName],
    [Name],
    [FirstName],
    [Phone],
    [Prim])

VALUES
   (@ID_Service,
    @ID_Post,
    @ID_PersonalStatus,
    @Login,
    @LastName,
    @Name,
    @FirstName,
    @Phone,
    @Prim)

SET @ID_Personal = (SELECT @@IDENTITY)

if @@error<>0    --Откат, в случае ошибки
   begin
   rollback tran
   return
   end --if @@error

COMMIT TRAN--Конец транзакции

RETURN--Выход из вложенной процедуры
GO
С уважением, Сергей.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 17.07.2007 (Вт) 21:31

0_o
Вот это да...

"... Like '%?%' ..." - это поиск строки с вхождением символа '?'
А "... Like '%' + ? +'%' ..." - поиск строки с вхождением подстроки, указанной в параметре.

Так понятнее?
label:
cli
jmp label

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.07.2007 (Ср) 11:29

iGrok писал(а):0_o
Вот это да...

"... Like '%?%' ..." - это поиск строки с вхождением символа '?'
А "... Like '%' + ? +'%' ..." - поиск строки с вхождением подстроки, указанной в параметре.

Так понятнее?


Мне не совсем ясно
1) конкатенация строк
Код: Выделить всё

'%' + ? +'%'
осуществляется на стороне сервера, или на стороне VB? Запрос должен выглядеть, как
Код: Выделить всё
Like '%условие%'
, а не
Код: Выделить всё
Like '%'Условие'%'
, получаемое после конкатенации. Тогда почему
Код: Выделить всё
Like '%' + ? +'%'
срабатывает?
2) Только иимвол "?" означает параметр?
С уважением, Сергей.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 18.07.2007 (Ср) 12:33

Тяжело...
Напиши в вб:
Код: Выделить всё

Dim a as string, s as string
a = "превед"
s = "A " + a + "! Это ты?"
debug.print s


И посмотри, что получится...

З.Ы. Особо помедитировать рекомендуется вот над этим:
GSerg писал(а):Ммм... Ты понимаешь, чем в коде программы отличаются varname и "varname"?

Для справки: переменная, заключенная в коде программы в кавычки, переменной уже не является.
label:
cli
jmp label

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.07.2007 (Чт) 8:19

iGrok писал(а):З.Ы. Особо помедитировать рекомендуется вот над этим:
GSerg писал(а):Ммм... Ты понимаешь, чем в коде программы отличаются varname и "varname"?

Для справки: переменная, заключенная в коде программы в кавычки, переменной уже не является.

iGrok, не ставь себя выше других, а то звёздная болезнь начнётся.
Код: Выделить всё

"SELECT * FROM vw_Personal WHERE [Код] LIKE '%' + ? + '%' OR [Логин] LIKE '%' + ? + '%' OR [Фамилия] LIKE '%' + ? + '%' OR [Имя] LIKE '%' + ? + '%' OR [Отчество] LIKE '%' + ? + '%' OR [Служба] LIKE '%' + ? + '%' OR [Должность] LIKE '%' + ? + '%' OR [Трудовые отношения] LIKE '%' + ? + '%' OR [Телефон] LIKE '%' + ? + '%' OR [Примечание] LIKE '%' + ? + '%'"

Данная строка вся заключена в кавычки.

И тем не менее, ? - это параметр.
С уважением, Сергей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.07.2007 (Чт) 8:43

Верно, потому что подстановка параметров осуществляется сервером, а не VB.
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.07.2007 (Чт) 10:05

Спасибо tyomitch. Примерно так я и предположил, хотел убедиться. Следовательно, не все БД поддержат данную конструкцию? К примеру, MY SQL v. 4 и ниже, должна выдать ошибку, т.к. не поддерживает хранимых процедур...? Или же SP тут не причём?
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.07.2007 (Чт) 12:30

SP тут ни при чём.
При чём тут prepared procedures.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 52

    TopList