Creating a Parameterized Query

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Creating a Parameterized Query

Сообщение y-nov » 10.09.2004 (Пт) 11:27

Help me, please!

Делаю выборку с помощью приложения на VB из базы SQL
В поле TextBox ввожу название фирмы, получаю все реквизиты фирмы (поставил WHERE FirmType = ?)
А если не хочется писать название фирмы в Textbox полностью, то как передать значение в parameters?
Как правильно написать LIKE?

То есть, Вот это не работает

Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open "select FirmTypeID,FirmType from FirmType WHERE FirmType = Like '" & Text1.Text & "' + '%'",
dbconnection, adOpenStatic, adLockOptimistic

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

Сообщение alibek » 10.09.2004 (Пт) 12:17

Если у тебя запрос параметрический, надо использовать ADO.Command
Lasciate ogni speranza, voi ch'entrate.

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 12:27

ADO.Command - это, в смысле, с помощью DataEnvironment ?

Просто, вот так проходит

adoPrimaryRS.Open "select FirmTypeID,FirmType from FirmType WHERE FirmType = '" & Text1.Text & "'", db, adOpenStatic, adLockOptimistic


И так проходит:

adoPrimaryRS.Open "select FirmTypeID,FirmType from FirmType WHERE FirmType Like " + "'AOO%'", db, adOpenStatic, adLockOptimistic


А когда пишу
adoPrimaryRS.Open "select FirmTypeID,FirmType from FirmType WHERE FirmType Like " + "'& Text1.Text &'", db, adOpenStatic, adLockOptimistic

то ни фига не хочет.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 10.09.2004 (Пт) 12:30

Код: Выделить всё
adoPrimaryRS.Open "select FirmTypeID,FirmType from FirmType WHERE FirmType Like '" & Text1.Text  &"'", db, adOpenStatic, adLockOptimistic

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 12:44

Мужики круто!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 15:16

Мужики круто!


А теперь в TextBox набери: П'ове'рка

;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 16:12

набрал.

Такой изврат.
Придется тады onError дописывать

А как правильно присвоить другой запрос открытому recordsety ?
Чтобы новые не плодить.

Т.е. хочется так
adoPrimaryRS.Close
adoPrimaryRS.Open "SELECT тра-та-та"

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 16:16

Такой изврат.
Придется тады onError дописывать

Зачем?

Просто надо писать примерно так (к примеру):

r.Open "SELECT * FROM MyTable WHERE MyField LIKE '" & REPLACE(Text , "'","''") & "'"

Ошибка, кстати, классическая...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 10.09.2004 (Пт) 16:26

Ага, а еще лучше написать "Проверка' or 1=1 --"
Lasciate ogni speranza, voi ch'entrate.

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 16:35

На своем веку с таким чудом еще не встречался.
Попробовал - работает. Спасибо.

А как все-таки, на счет закрытия и открытия recordsetov?
Неужто нужно каждый раз писать

adoPrimaryRS.Close

Set adoPrimaryRS = Nothing
Set adoPrimaryRS = New Recordset

adoPrimaryRS.Open

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 10.09.2004 (Пт) 16:44

Не нужно, этого вполне достаточно:
Код: Выделить всё
adoPrimaryRS.Close
adoPrimaryRS.Open "SELECT тра-та-та"

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 16:44

Неужто нужно каждый раз писать

adoPrimaryRS.Close
Set adoPrimaryRS = Nothing
Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open

Не обязательно - можно менять Source и делать затем Requery...

Или пользовать Command
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 17:26

Чегой -то не получается.

Т.е. у меня - когда Form_load
я создаю connection и recordset. И всем полям даю значения из таблицы.

Дальше пользователь хочет найти нужну запись.
Он вводит название фирмы в Text.box и кликает по кнопке.

Вот в этой кнопке мне хочется закрыть AdoPrimaryRS и открыть его заново, но под новый запрос.

Причем мне бы не хотелось в этой кнопке опять писать Set dbconnection = New Connection.

Я конечно объявил в самом верху
Dim db As Connection
Dim WithEvents adoPrimaryRS As Recordset,
но все равно чего-то не помогает.
Он ругается, что объект закрыт и ничего с этим не поделаешь

Так что сейчас я в этой кнопке заново устанавливаю соединение. Создаю новый recordset (правда с тем же именем), беру записи из полученного запроса и раздаю их полям.
Мне кажется это полным безобразием.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 10.09.2004 (Пт) 17:31

Что значит: "..объявил в самом верху"? :roll:
На уровне модуля или в обработчике Form_load?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 10.09.2004 (Пт) 18:15

Раз "в самом верху" и WithEvents - это очевидно на уровне модуля.

y-nov, а ты, часом, в Form_Load не делаешь Set db = nothing или там db.Close? И вообще, ту коннекцию открываешь - db?

Будет всем лучше, если сюда в форум ты запостишь код Form_Load. Разберемся, почему не работает...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

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

Сообщение alibek » 10.09.2004 (Пт) 18:26

Rainbow, если WithEvents, то не может быть модуль, только форма или класс :)
Lasciate ogni speranza, voi ch'entrate.

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 10.09.2004 (Пт) 18:39

В самом верху - значит объявил глобальные переменные для этой формы.

Код вставить не могу, т.к. я уже дома.
Но там точно нет Set db=nothing и db.Close

Спасибо всем за ответы.
Скорее всего до понедельника.

(Может конечно Visual Basic сейчас взгромоздить на тачку)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 13.09.2004 (Пн) 10:25

alibek писал(а):Rainbow, если WithEvents, то не может быть модуль, только форма или класс :)

alibek, в модуле формы или модуле класса - годится? ;)

y-nov писал(а):Но там точно нет Set db=nothing и db.Close

Это хорошо. Но все же если VB говорит "закрыт", значит ты его где-то закрыл. Так что вопрос лучше кодом... :)
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 13.09.2004 (Пн) 10:55

Rainbow писал(а):Это хорошо. Но все же если VB говорит "закрыт", значит ты его где-то закрыл. Так что вопрос лучше кодом... :)


Или не открыл. Элементарно поиском проверь на опечатки. Поставь везде.
Debug.Print и точки останова. Посотри, что и где открывается. Отладка - вещь нудная, но необходимая.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 13.09.2004 (Пн) 11:29

Блин, действительно работает adoPrimaryRS.Close
adoPrimaryRS.Open

Я в Form_Load
коннект как локальный объявил.
Голова садовая.

А как строку
db.Open "PROVIDER=MSDASQL;dsn=LandODBC;uid=;pwd=;database=MyBase"

брать из инишника, т.к. я не знаю как будет называться база?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.09.2004 (Пн) 11:42

А как строку
db.Open "PROVIDER=MSDASQL;dsn=LandODBC;uid=;pwd=;database=MyBase"
брать из инишника, т.к. я не знаю как будет называться база?


Лучше бери из udl-файла. Примерно так:

Код: Выделить всё
g_cn.Open "File Name=" & App.Path & "My.udl"


Оно так и настраивать Connect удобней будет.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 13.09.2004 (Пн) 13:09

А что нужно установить, чтобы можно было создавать Microsoft Data Link?
Я не могу создать UDL файл в explorer.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.09.2004 (Пн) 14:42

Поспробуй создать пустой файл с расширением udl - хоть в том-же nоtepad-e. Потом запусти его и редактируй... ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 13.09.2004 (Пн) 15:05

Я написал в файле My.udl

PROVIDER=MSDASQL;dsn=LandODBC;uid=;pwd=;database=MyBase

А VB говорит
File name or class name not found Automation operation

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.09.2004 (Пн) 15:10

Я написал в файле My.udl


Зачем тебе что-то писать в udl-файле? Запусти его и у тебя откроется окошко построителя - в нем и укажешь свою базу...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 13.09.2004 (Пн) 15:24

Вероятно, у товарища нет "построителя". Поэтому, можно использовать INI файл (на форуме было, а еще пример есть в API-Guide www.allapi.net).
Можно хранить в реестре (SaveSetting/GetSetting), или через API.
Можно просто хранить настройки в текстовом файле произвольного формата (а можно и в двоичном).
Еще, настройки можно загнать в Базу Данных, Access или свою (http://vbstreets.ru/VB/Articles/65546.aspx).

Вариантов много.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.09.2004 (Пн) 15:31

Вероятно, у товарища нет "построителя".


Вообще-то если не работает "построитель" (хотя у меня вроде везде работал), то собственно cам по себе UDL-файл это обычный юникодовский текстовый файл.

Пример его содержимого:

Код: Выделить всё
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=EMT;Data Source=(local)


Скопировать в notepad, исправить там на нужное и при сохранении указать что кодировка Юникод...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 13.09.2004 (Пн) 16:04

Пишу в файле

[MSDASQL]
PROVIDER=MSDASQL;dsn=LandODBC;uid=;pwd=;database=MyBase

Сохраняю в юникоде.
Та же ошибка.

А если дважды кликаю по My.udl, то запускается notepad.
О каком построителе идет речь?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.09.2004 (Пн) 16:14

О каком построителе идет речь
[/quote]

См. приложенный рисунок. По идее у тебя он должен запускаться при запуске UDL-ки. Попробуй убрать ее ассоциацию с notepad...
У вас нет доступа для просмотра вложений в этом сообщении.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

y-nov
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.09.2004 (Пт) 11:21

Сообщение y-nov » 13.09.2004 (Пн) 17:18

Все заработало, спасибо.

Когда создал файл с помощью explorer, то он поставил двойное расширение My.udl.txt

А как в DataCombo сделать чтобы значения брались только из таблицы и пользователь не мог написать значение от фонаря?


Вернуться в Базы данных

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

Сейчас этот форум просматривают: SemrushBot и гости: 1

    TopList