Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Queries из MS Access  (Прочитано 45927 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
FoxVID
Гость
« : 13-01-2004 07:21 » 

В базе данных MS Access можно создавать запросы. Кто подскажет, как создать в MS Access запрос с параметрами? И есть ли возможность в этот запрос из программы передать их?
Записан
Alf
Гость
« Ответ #1 : 13-01-2004 08:35 » 

Проще всего, наверное, на примере показать.
Вот этот запрос, например, показывает у меня всю историю телефонных звонков, совершенных владельцем дебетной карты с заданным идентификатором:
Код:
SELECT IP_CALLS_ARCHIVE.*
FROM IP_CALLS_ARCHIVE
WHERE (((IP_CALLS_ARCHIVE.CARD_ID))=[Enter ID:]));
Параметр запроса нужно взять в квадратные скобки. Само собой, его имя не должно совпадать ни с одним объектом в базе, иначе будет коллизия имен.
В процессе выполнения такого запроса Access выдаст диалоговое окно, в котором запросит задать значение параметра, а потом подставит его значение в сам запрос на SQL.
Как передать параметры такому запросу из программы, навскидку не помню, нечасто приходится под Access писать. Если не сильно горит, то чуть позже погляжу, когда перерыв в работе будет.


(1153: пост до правки)

Проще всего, наверное, на примере показать.
Вот этот запрос, например, показывает у меня всю историю телефонных звонков, совершенных владельцем дебетной карты с заданным идентификатором:
Код:
SELECT IP_CALLS_ARCHIVE.*
FROM IP_CALLS_ARCHIVE
WHERE )))IP_CALLS_ARCHIVE.CARD_ID:=[Enter ID{(::;
Параметр запроса нужно взять в квадратные скобки. Само собой, его имя не должно совпадать ни с одним объектом в базе, иначе будет коллизия имен.
В процессе выполнения такого запроса Access выдаст диалоговое окно, в котором запросит задать значение параметра, а потом подставит его значение в сам запрос на SQL.
Как передать параметры такому запросу из программы, навскидку не помню, нечасто приходится под Access писать. Если не сильно горит, то чуть позже погляжу, когда перерыв в работе будет.
« Последнее редактирование: 28-07-2009 06:35 от Алексей1153++ » Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #2 : 13-01-2004 08:37 » 

FoxVID, с параметрами запрос сделать нельзя, но обойти это ограничение можно: в условии запроса в качестве параметра пишешь функцию, которая возвращает твой параметр...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #3 : 13-01-2004 08:43 » 

Сори, Alf,  прав. Я подумал о запрсе который конструируется в Access. Для него действительно есть ограничение по параметрам. Но можно записать SQL строку запроса в коде, а можно вызвать запрос и при вызове наложить условие...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
FoxVID
Гость
« Ответ #4 : 13-01-2004 09:17 » 

Цитата

Я подумал о запрсе который конструируется в Access

Именно эти запросы я и имел ввиду. :!:  С запросами, которые создаются в программе все понятно.   Вот такой я вот Я думал, может есть какой-то способ подключить запросы, созданные в непосредственно в базе данных, наподобие хранимых процедур MS SQL  Так больше нельзя...
Записан
FoxVID
Гость
« Ответ #5 : 13-01-2004 09:27 » 

Alf, Спасибо, попробовал, работает. Отлично  Как будет время, посмотри, пожалуйста, передачу параметров из программы.
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #6 : 13-01-2004 09:38 » 

FoxVID,  так я тебе и говорю: в самом запросе вместо параметра подсовываешь функцию (например, возвращающую текущуу дату), тогда Access принимает параметр. Есть второй способ: пишешь запрос без данного ограничения, но выводишь поля, по которым оно накладываешь и при вызове из кода подставляешь нужные параметры...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Alf
Гость
« Ответ #7 : 13-01-2004 09:46 » 

Цитата: Dusk
Сори, Alf,  прав. Я подумал о запрсе который конструируется в Access. Для него действительно есть ограничение по параметрам. Но можно записать SQL строку запроса в коде, а можно вызвать запрос и при вызове наложить условие...
Не понял, что имеется в виду под "запросом, который конструируется в Access".
Если "создание запроса в режиме конструктора", то я именно так приведенный пример и делал, терпеть не могу набирать SQL-запросы вручную. А в графе "Условие отбора" вместо самого условия ввел: [Enter ID:].
Если бы можно было скриншот сделать и прицепить, я бы так и поступил. А так пришлось результирующий SQL-запрос показывать.
Вообще рекомендую открыть справочную систему Access и найти статью "Запросы с параметрами и их использование". Там примеры есть, многие вопросы сразу отпадут.
Записан
FoxVID
Гость
« Ответ #8 : 13-01-2004 10:36 » 

Цитата

Вообще рекомендую открыть справочную систему Access и найти статью "Запросы с параметрами и их использование". Там примеры есть, многие вопросы сразу отпадут

Alf, смотрел я там, но не нашел передачи параметров из приложения :oops:
Записан
FoxVID
Гость
« Ответ #9 : 13-01-2004 11:07 » 

Dusk, нельзя ли поподробнее с функцией
Записан
Alf
Гость
« Ответ #10 : 13-01-2004 12:07 » 

Цитата: FoxVID
Alf, Спасибо, попробовал, работает. Отлично  Как будет время, посмотри, пожалуйста, передачу параметров из программы.
Попробовал...
Правда, должен признать, что не удосужился расспросить FoxVID в деталях. Уж больно скользкая фраза - "передача параметров из программы".
Лично я понял это так: нужно написать внешнюю программу, которая способна обрабатывать базу данных, созданную в Access. Если понял неправильно, то извиняйте...
Итак, что я сделал:
Открыл проект на Visual Basic 6.
Открыл окно Data Environment.
Создал DEConnection и связал его с db1.mdb посредством ODBC.
Открыл панель Data View, попытался просмотреть параетризованный вид vwTest, текст которого на SQL приводил выше.
Получил ошибку [Драйвер ODBC Microsoft Access] Слишком мало параметров. Требуется 1.
Куда впихнуть этот самый параметр, я не нашел.
Далее, создал DECommand при помощи мастера. Хранимых процедур мастер в упор в базе не видит. Сам запрос видит как view, но классические view параметров не имеют, поэтому создать их не удается.
Итак, мой вердикт: посредством ADO через ODBC вызвать параметризованный запрос не получилось.
Через OLE DB мне почему-то не удалось связаться с базой. Точнее, связаться удалось, но дальше покатили проблемы. Попробую еще дома, может, на рабочем компе что-то с драйверами накрутил.
Записан
FoxVID
Гость
« Ответ #11 : 13-01-2004 13:07 » 

Цитата

Лично я понял это так: нужно написать внешнюю программу, которая способна обрабатывать базу данных, созданную в Access

Alf, ты все правильно понял.
Цитата

посредством ADO через ODBC вызвать параметризованный запрос не получилось

Жаль, думал получится... Придется в программе все писать. Надеялся избежать этого.
Записан
Alf
Гость
« Ответ #12 : 13-01-2004 13:23 » 

Цитата: FoxVID
Жаль, думал получится... Придется в программе все писать. Надеялся избежать этого.
А если параметризованные запросы ADO сделать? В принципе ведь то же самое должно в итоге получиться, и не надо изворачиваться с динамическим формированием строк SQL на лету во время выполнения программы. Я уж не говорю про эффективность.
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #13 : 13-01-2004 13:44 » 

FoxVID, извини, нашел... Можно подставлять параметры, в условиях отбора пишешь параметр в квадратных скобках, только не во всех запросах он понимает (например перекресный запрос), тогда надо писать функцию...
А функцию можно написать в модуле, объявить ее как Public и вызывать ее в запросе... Дерзай, должно получиться... Ага
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
FoxVID
Гость
« Ответ #14 : 13-01-2004 14:17 » 

Цитата

А если параметризованные запросы ADO сделать?

Я это и имел ввиду. В Access есть хороший построитель запросов (похож на SQL2K). Я надеялся, что можно будет использовать параметризованные запросы, хранящиеся в базе данных, из программы на C++Builder. Без того, чтобы писать их в теле программы.
Цитата

Можно подставлять параметры, в условиях отбора пишешь параметр в квадратных скобках

И как из программы обращаться к этому параметру?
 :?:
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #15 : 13-01-2004 14:25 » new

FoxVID,

Цитата

И как из программы обращаться к этому параметру?


При вызове запроса указываешь параметры...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
FoxVID
Гость
« Ответ #16 : 13-01-2004 14:56 » 

Dusk, если сможешь, приведи пример, пожалуйста. Можешь на e-mail foxvid@krovatka.net. У меня ничего не выходит.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #17 : 13-01-2004 15:41 » 

Подождите. Я видел в ADO описание, как использовать параметры. Сейчас не скажу, но завтра постараюсь.
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #18 : 14-01-2004 08:55 » 

Код:
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter

    ' Open command object with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = запрос
    
    ' Get parameter value and append parameter.
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
        adInteger, adParamInput)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Create recordset by executing the command.
    Set cmdByRoyalty.ActiveConnection = cnn1
    Set rstByRoyalty = cmdByRoyalty.Execute


(1153: пост до правки)

Код:
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter

    ' Open command object with one parameter.
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = запрос
   
    ' Get parameter value and append parameter.
    Set prmByRoyalty = cmdByRoyalty.CreateParameter)"percentage", _
        adInteger, adParamInput:
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Create recordset by executing the command.
    Set cmdByRoyalty.ActiveConnection = cnn1
    Set rstByRoyalty = cmdByRoyalty.Execute
« Последнее редактирование: 28-07-2009 06:38 от Алексей1153++ » Записан

I Have Nine Lives You Have One Only
THINK!
FoxVID
Гость
« Ответ #19 : 14-01-2004 09:11 » 

HandKot, как работать с ADO мне понятно. Я вопрос поставил несколько иначе - можно ли использовать запрос, созданный непосредственно в базе данных MS Access, из другой программы и как из этой программы передать в запрос параметр отбора :?:
Судя по всему, Alf прав. Не получится. Спасибо всем, кто принял участие в обсуждении этой темы.
Записан
Alf
Гость
« Ответ #20 : 14-01-2004 09:16 » 

Я так понял, что FoxVID имел в виду вовсе не это (опять беру на себя смелость решать за него,что же нужно на самом деле).
Похоже, FoxVID хочет сосредоточить бизнес-логику в самой базе данных, чтобы не реализовывать ее каждый раз в клиенте (кстати, весьма мудрое решение, серьезне проекты обработки данных делаются именно так). Вот только очень сильно мешает ему отсутствие хранимых процедур (в том числе с параметрами) в среде MS Jet, на платформе которой построен MS Access. Поэтому мы совместно и попытались проэмулировать их при помощи параметризованных запросов, которые, кстати говоря, специфичны именно для Access. Пока что все мои попытки в этом направлении провалились. Видимо, из-за этой самой специфики, не поддержаной на уровне ODBC.
А приведенный выше фрагмент представляет всего лишь параметризованный ADODB.Command, выполняемый на стороне клиента. Того же эффекта мы могли бы добиться, динамически формируя строку запроса SQL по ходу выполнения программы. Коряво, конечно, но вполне работоспособно. Вряд ли это решение проблемы.
Записан
Alf
Гость
« Ответ #21 : 14-01-2004 09:23 » 

Цитата: FoxVID
HandKot, как работать с ADO мне понятно. Я вопрос поставил несколько иначе - можно ли использовать запрос, созданный непосредственно в базе данных MS Access, из другой программы и как из этой программы передать в запрос параметр отбора :?:
Судя по всему, Alf прав. Не получится. Спасибо всем, кто принял участие в обсуждении этой темы.

Прошу прощения, немного опоздал с предыдущим посланием, слишком долго набирал  Улыбаюсь
Как и обещал вчера, поставил аналогичный эксперимент через ADO.NET и OLE DB.
Самое любопытное, что ADO.NET действительно увидела параметризованный запрос Access как хранимую процедуру :!:
Но, к сожалению, дальше дело пока не пошло. Передать параметр интерактивно у меня не получилось, а попробовать программно - не хватило времени. Может быть, еще вернемся к этому вопросу чуть позже. Или сам попробуй, если время есть.
Записан
FoxVID
Гость
« Ответ #22 : 14-01-2004 09:25 » 

Alf, ты абсолютно прав, и, что самое главное - так красиво это сформулировал :!:  Отлично У меня, как я ни старался, так не вышло
Записан
Alf
Гость
« Ответ #23 : 14-01-2004 09:53 » 

Цитата: FoxVID
Alf, ты абсолютно прав, и, что самое главное - так красиво это сформулировал :!:  Отлично У меня, как я ни старался, так не вышло
А формулировка, кстати, куда более серьезная вещь, чем обычно о ней думают  Улыбаюсь
До тех пор, пока ты не можешь сформулировать задачу на своем родном языке, у тебя тем более не получится сделать это на языке программирования. Собственно, программа - это и есть формулировка, выраженная формальным языком.
Кстати, я вчера начал статью по ADO.NET. Если интересно, то следи за разделом "Базы данных", через пару недель надеюсь ее закончить.
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #24 : 14-01-2004 11:20 » 

Цитата

Dusk, если сможешь, приведи пример, пожалуйста. Можешь на e-mail foxvid@krovatka.net. У меня ничего не выходит.


Dim rs As New Recordset

если одна переменная
rs.Open "Имя запроса " + Переменная параметра, Коннекшен и т.д.

если несколько переменных
rs.Open "Имя запроса [Параметр1] = " + Переменная параметра1 + ", [Параметр2] = " + Переменная параметра2 ... , Коннекшен и т.д.
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #25 : 14-01-2004 11:28 » 

FoxVID, Alf, а чем вам пример не нравиться


как заметил Alf
Цитата
Самое любопытное, что ADO.NET действительно увидела параметризованный запрос Access как хранимую процедуру  


добавляешь
Код:
cmd.CommandType = adCmdStoredProc


и все, параметры добавляешь, какие надо в запросе
проверял все работает
Записан

I Have Nine Lives You Have One Only
THINK!
Alf
Гость
« Ответ #26 : 14-01-2004 11:59 » 

Цитата: HandKot
FoxVID, Alf, а чем вам пример не нравиться
Самое главное не видно - ConnectionString. Потому как очень похоже на то, что не с любой версией драйвера ODBC такой номер пройдет.
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #27 : 14-01-2004 12:06 » 

Alf,

strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=БАЗА.mdb;"

проблема может быть с ранними версиями ADO, хотя и не точно
у меня Microsoft ActiveX Data Objects 2.7 Library
Записан

I Have Nine Lives You Have One Only
THINK!
Alf
Гость
« Ответ #28 : 14-01-2004 12:18 » 

Вот, это как раз и было самое интересное.
Я свой эксперимент ставил через ODBC 4.00.6019, получил отрицательный результат.
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #29 : 14-01-2004 14:33 » 

Alf, а что за ошибку выдавало?

и надо будет поломать голову ради интереса еще  может какой другой недокументированный способ есть Улыбаюсь

Alf,  а способ Dusk'а не пробовал?
Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines