Обычный запрос или параметрический

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

Обычный запрос или параметрический

Сообщение sergey-911 » 25.07.2007 (Ср) 0:51

Доброго времени суток уважаемые.
Есть форма с таблицей. Сделал для пользователей полнотекстовый поиск. Т.е. есть текстбокс, куда пользователь заносит условие поиска, любое. Дальше идет анализ условия запроса и полей (а также типа полей) таблицы и формируется запрос. Механизм, впринципе, довольно универсальный и работает неплохо.
Для примера
Код: Выделить всё
SELECT * FROM vw_Personal WHERE [Код] LIKE '%10%' OR [Логин] LIKE '%10%' OR [Фамилия] LIKE '%10%' OR [Имя] LIKE '%10%' OR [Отчество] LIKE '%10%' OR [Служба] LIKE '%10%' OR [Должность] LIKE '%10%' OR [Трудовые отношения] LIKE '%10%' OR [Телефон] LIKE '%10%' OR [Примечание] LIKE '%10%'

На днях немного доработал, механизм примерно тот же, но запрос формируется параметрический, в зависимости от таблицы (огромное спасибо GSerg и alibek).
Теперь
Код: Выделить всё
SELECT * FROM vw_Personal WHERE [Код] LIKE '%' + ? + '%' OR [Логин] LIKE '%' + ? + '%' OR [Фамилия] LIKE '%' + ? + '%' OR [Имя] LIKE '%' + ? + '%' OR [Отчество] LIKE '%' + ? + '%' OR [Служба] LIKE '%' + ? + '%' OR [Должность] LIKE '%' + ? + '%' OR [Трудовые отношения] LIKE '%' + ? + '%' OR [Телефон] LIKE '%' + ? + '%' OR [Примечание] LIKE '%' + ? + '%'

Код: Выделить всё
Dim c As ADODB.Command
Set c = New ADODB.Command
c.CommandType = adCmdText

c.Parameters.Append c.CreateParameter _
("strParam" & j, adVarChar, adParamInput, 5000, "10")
...
...
c.CommandType = adCmdText
c.Parameters.Append c.CreateParameter _
("strParam" & j, adVarChar, adParamInput, 5000, "10")

    'Подключаемся к БД
    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    conn.Open (Connect.Soedinenie)
    Dim r As ADODB.Recordset
    Set c.ActiveConnection = conn
    c.CommandType = adCmdText
    c.CommandText = sql
    Set r = New ADODB.Recordset
    r.Open c, , adOpenStatic, adLockReadOnly
    'Отключаемся от БД
    Set r = Nothing
    Set conn = Nothing
    Set c = Nothing

Вопрос заключается в том, какой вариант предпочтительнее? Работает быстрее? Более правильный? Разница по быстродействию практически не ощутима, но первый вариант (без параметров), если не ошибаюсь, работает побыстрее, самую малость.


---
P.S. И ещё, прошу прощения у модераторов за откровенность и вопрос, возможно не в тему, хочу узнать, у меня у одного лучший сайт времен и народов "vbstreets.ru" открывается порой по 4 минуты\страничка, хотя у меня выделенка.
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.07.2007 (Ср) 7:59

Без разницы, но параметрический удобнее в использовании и позволяет не беспокоится о SQL-инъекциях.
Кроме того, если запрос вызывается многократно, то для параметрического запроса можно установить ADODB.Command.Prepared=True, что ускорит выполнение запроса. Для динамического SQL тоже можно установить Prepared, но толку это не даст.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение sergey-911 » 25.07.2007 (Ср) 10:16

Спасибо alibek.
С уважением, Сергей.

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

Сообщение GSerg » 25.07.2007 (Ср) 11:53

sergey-911 писал(а):P.S. И ещё, прошу прощения у модераторов за откровенность и вопрос, возможно не в тему, хочу узнать, у меня у одного лучший сайт времен и народов "vbstreets.ru" открывается порой по 4 минуты\страничка

Баян.
http://bbs.vbstreets.ru/viewtopic.php?t=31173
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение sergey-911 » 25.07.2007 (Ср) 12:30

Печально, конечно.
Но, баян - так баян.
GSerg - тебе виднее.
:cry:
С уважением, Сергей.

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

Сообщение GSerg » 25.07.2007 (Ср) 18:23

Вопрос.
sergey-911, ты ссылку после слова "баян" видел?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение sergey-911 » 25.07.2007 (Ср) 22:13

Видел, GSerg, и читал. Согласен, "баян".
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 26.07.2007 (Чт) 9:38

По теме: использовать нужно только параметрические запросы. Почему - наглядно демонстрируется тут.

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

Сообщение sergey-911 » 26.07.2007 (Чт) 17:29

Спасибо Ennor, весьма убедительно.
С уважением, Сергей.


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

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

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

    TopList  
cron