Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11

Использование функций базы данных в запросе

19.11.2013, 16:11. Показов 1761. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Хотел бы узнать существует ли в ADODB.Recordset всякого рода функции?
Ну например я построил запрос :
Visual Basic
1
2
3
4
5
6
7
8
9
Dim oCn As ADODB.Connection
Dim AD As ADODB.Recordset
Set oCn = New ADODB.Connection
Set AD = New ADODB.Recordset
oCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C\BD.mdb ; OLEDB:Database "
oCn.Open
 
ZAPROS = "SELECT * FROM `KADRY` WHERE `dDate`=#01/01/2013#"
AD.Open ZAPROS , oCn, adOpenDynamic, adLockPessimistic
Могу ли я по данному запросу узнать количество, строк? Или например получить массив уникальных значений определенного поля, если поле числовое то получить сумму всех значений в нем по данному запросу ну и т.д.

Я думую такие инструменты по-любому существуют в подключении к бд.

ЗЫ: извеняюсь если разрезал слух кому своей неосведомленностью в каких-то вопросах.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2013, 16:11
Ответы с готовыми решениями:

Использование функций в SQL запросе, в частности, фильтрация данных
Dim d1, d2, m1, m2, y1, y2 As String d1 = Me.DateTimePicker1.Value.Day d2 = Me.DateTimePicker2.Value.Day m1 =...

Использование скалярных функций в запросе
Всем здравствуйте! В БД есть функция, допустим, DB.dbo.GetFoo(). Проблема в том, что при подключении к БД, если в запросе она указана с...

Использование своих функций в SQL-запросе
Всем привет. Задача: https://www.cyberforum.ru/ms-access/thread2256520.html Суть: нужно отсортировать строки с числами вида X.Y. и...

19
Заблокирован
19.11.2013, 18:28
Visual Basic
1
MsgBox rs.RecordCount
- Получаем кол-во строк в наборе. Если считать сумму по полям, тогда SQL запрос

SQL
1
COUNT
Добавлено через 36 минут
Есть еще функция:

SQL
1
SUM
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
20.11.2013, 09:42  [ТС]
Методом "тыка" таки нашел решение.
В запросе там где указывается звездочка (между словами SELECT и FROM ).
Прописываются функции типа SUM, COUNT и другие. Для которых в качестве аргументов используются названия полей заключенные в квадратные скобки, пример:
Visual Basic
1
ZAPROS = "SELECT SUM([Value]) FROM `KADRY` WHERE `dDate`=#01/01/2013#"
Здесь мы получим сумму всех строк по столбцу "Value" за 1е января 2013 года. Или еще пример:
Visual Basic
1
ZAPROS = "SELECT COUNT(*) FROM `KADRY` WHERE `dDate`=#01/01/2013#"
Тут мы получим количество строк попавших под этот запрос к БД.
А и самое главное .. результат выводиться следующим образом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim oCn As ADODB.Connection
Dim AD As ADODB.Recordset
Set oCn = New ADODB.Connection
Set AD = New ADODB.Recordset
oCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C\BD.mdb ; OLEDB:Database "
oCn.Open
 
ZAPROS = "SELECT COUNT(*) FROM `KADRY` WHERE `dDate`=#01/01/2013#"
AD.Open ZAPROS , oCn, adOpenDynamic, adLockPessimistic
 
Msgbox AD.Fields(0).Value
Добавлено через 5 минут
Спрашивающий,
Существует ли функция, с помощью которой можно получить массив уникальных значений определенного поля?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.11.2013, 10:31
Цитата Сообщение от Bati4eli Посмотреть сообщение
Существует ли функция, с помощью которой можно получить массив уникальных значений определенного поля?
SQL
1
SELECT DISTINCT [ОпределенноеПоле] FROM Таблица
1
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
20.11.2013, 15:56  [ТС]
mobile,
Спасибо! Очень полезная функция! А может она тоже самое проделать, только по нескольким полям?
И вообще есть офф сайтик где есть перечень всех этих функций с синтаксисом?

Добавлено через 27 минут
Цитата Сообщение от Спрашивающий Посмотреть сообщение
Visual Basic
1
MsgBox rs.RecordCount
- Получаем кол-во строк в наборе.
Данный метод всё время возвращает -1
0
Заблокирован
20.11.2013, 17:06
Посмотрите тему созданную invDS в полезных примерах и кодах.
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.11.2013, 17:52
Цитата Сообщение от Bati4eli Посмотреть сообщение
А может она тоже самое проделать, только по нескольким полям?
DISTINCT создает неявное группирование по всем полям в селекте и можно быть уверенным, что набор в каждой выводимой записи будет уникальным

Цитата Сообщение от Bati4eli Посмотреть сообщение
есть офф сайтик где есть перечень всех этих функций с синтаксисом?
Функционал SQL весьма различается для разных СУБД. Есть, конечно общие части, но все-таки надо определиться для какой БД будете изучать. Но самый лучший способ это практика на сайте sql-ex. Много замечательных программистов так или иначе паслись на сайте, нарабатываю навыки работы с скл.

Цитата Сообщение от Bati4eli Посмотреть сообщение
Данный метод всё время возвращает -1
Надо заполнить рекордсет данными и он покажет правильный результат. Для этого надо пройти в конец (и вернуться): rst.Movelast: rst.Movefirst
1
Заблокирован
20.11.2013, 17:55
mobile,
Цитата Сообщение от mobile Посмотреть сообщение
Надо заполнить рекордсет данными и он покажет правильный результат.

Для этого надо пройти в конец (и вернуться): rst.Movelast: rst.Movefirst
Не говорите ерунды ! Если вы такое провернете с записями в 200.000 на 4 машинах?


Visual Basic
1
2
3
4
5
    Set rs = Nothing
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "SELECT * FROM TABLE", conn, adOpenDynamic, adLockBatchOptimistic
    MsgBox rs.RecordCount
Обратите внимание на:

adOpenDynamic, adLockBatchOptimistic

Я же сказал прочитайте статью inv.DS прекрасно и просто написано.
1
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.11.2013, 23:20
Цитата Сообщение от Спрашивающий Посмотреть сообщение
Не говорите ерунды ! Если вы такое провернете с записями в 200.000 на 4 машинах?
Ага. Не обратил внимания, что адо. :-(
0
Заблокирован
21.11.2013, 07:04
mobile, Будем смотреть в будущие !
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
21.11.2013, 09:42  [ТС]
mobile,
1) я имел ввиду не просто уникальный список значений для каждого из столбцов, а список уникальных наборов по определенным столбцам
2) я юзаю базы Access, и пока в старом формате (mdb)
3)
Цитата Сообщение от Спрашивающий Посмотреть сообщение
Visual Basic
1
2
3
4
5
Set rs = Nothing
 Set rs = New ADODB.Recordset
 rs.CursorLocation = adUseClient
 rs.Open "SELECT * FROM TABLE", conn, adOpenDynamic, adLockBatchOptimistic
 MsgBox rs.RecordCount
Отлично сработало! Просто ADO я методом тыка изучаю.. и не совсем понимаю разницу между adLockPessimistic и adLockBatchOptimistic.
И можете кинуть ссыль на пост от invDS ?
0
Заблокирован
21.11.2013, 14:55
Bati4eli,

Подключение к базе данных через ADODB (статья)
Примеры SQL запросов к базе данных через оболочку Visual Basic да и других языков

Свойства объекта ADO.Recordset, свойства CursotType, LockType, CursorLocation, параметр Options метода Open()

При открытии объекта Recordset есть возможность определить еще несколько очень важных его свойств (их можно определить как напрямую перед открытием, так и как дополнительные параметры метода Open):

· первое свойство - CursorType, тип курсора. Это свойство определяется только перед открытием Recordset (после открытия оно доступно только на чтение). Курсор можно представить себе как указатель на записи в Recordset. В зависимости от типа курсора мы определяем возможности работы с Recordset и производительность выполняемых операций (чем больше возможностей, тем меньше производительность, и наоборот). Какие варианты значений возможны:

o adOpenForwardOnly (значение 0) - это значение используется по умолчанию. Оно оптимизировано для достижения максимальной производительности (он возможности будут минимальными). Курсор может двигаться только вперед, изменения, вносимые другими пользователями, видны не будут.

o adOpenStatic (3) - тоже, что и предыдущий, за исключением того, что можно двигаться во всех направлениях;

o adOpenKeyset (1) - позволяет двигаться в любом направлении, видны только изменения существующих записей другими пользователями (удаление старых и добавление новых не видны);

o adOpenDynamic (2) - обеспечивает максимальные возможности: позволяет двигаться в любых направлениях, видны любые изменения в записях, производимые другими пользователями. К сожалению, провайдер Microsoft.Jet.OLEDB.4.0 этот тип курсора не поддерживает, поэтому с Access и Excel его использовать не получится.

Свойство Recordset.RecordCount нормально функционирует только для курсоров типа Static и Keyset. Для курсоров типа ForwardOnly и Dynamic оно возвращает (-1), поскольку драйвер подключения не может определить количество записей.

· второе важное свойство - CursorLocation. Оно определяет, где будет создан курсор - на сервере или на клиенте. По умолчанию используется значение adUseServer (2) - создавать на сервере. Есть возможность использовать значение adUseClient (3) - создавать на клиенте. В целом практически во всех ситуациях удобнее и производительнее использовать серверные курсоры, за одним исключением - в реализации серверных курсоров на разных источниках данных больше отличий, поэтому если вы планируете работать с разными источниками, есть смысл подумать о клиентских курсорах.

· третье важное свойство - LockType. Это свойство определяет тип блокировок, которые будут наложены на записи на источнике, помещенные в Recordset. Можно использовать следующие значения:

o adLockReadOnly (1) - записи в Recordset будут доступны только на чтение, вы не сможете их изменять. Это значение используется по умолчанию.

o adLockPessimistic (2) - наиболее надежный с точки зрения целостности данных вид блокировки. Вы можете изменять записи в Recordset, но при начале изменения записи она блокируется на источнике таким образом, что другие пользователи не смогут обратиться к ней ни на чтение, ни на запись, пока вы не вызовете методы Update или CancelUpdate.

adLockOptimistic (3) - это значение позволяет выиграть в производительности за счет проигрыша в надежности обеспечения целостности данных. Запись на источнике блокируется только на время выполнения метода Update. Остальные пользователи могут одновременно с вами читать и изменять данные на источнике.

adLockBatchOptimistic (4) - то же самое, что обычное оптимистичное, но вместо немедленного обновления по одной записи используется пакетное обновление. В ситуации, когда изменяется большое число записей, такое решение позволяет выиграть в производительности.

Первый параметр метода Open в наших примерах был именем таблицы и командой SQL (могут использоваться и другие варианты). Поскольку драйвер OLE DB не знает, чем может быть передаваемый текст, он взаимодействует с сервером баз данных, чтобы выяснить этот вопрос. На практике такое выяснение может сильно тормозить работу приложения, поэтому есть смысл перед открытием Recordset явно указать тип передаваемых данных. Это делается при помощи параметра Options, который передается этому методу. Наиболее часто используемые значения таковы:

· adCmdText (1) - передаваемый текст - команда SQL;

· adCmdTable (2) - сгенерировать команду SQL, которая вернет все записи из таблицы (передается только имя таблицы);

· adCmdTableDirect (512) - получить все записи из таблицы напрямую (без выполнения SQL-запроса), если источник поддерживает такую операцию.

· adCmdStoredProc (4) - выполнить хранимую процедуру и использовать то, что она вернет, для заполнения Recordset.
1
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
18.12.2013, 11:07  [ТС]
Спрашивающий,
подскажи, пожалуйста, возможно ли такое:
у меня есть база, в которой есть поля Фамилия, Имя, Отчество и например пользователей подает запрос найти *иван* .. вот каким образом построить запрос, чтобы получить все строки где есть этот иван. Пускай это будет хоть Иванов, хоть Иван, хоть Иванович.

Добавлено через 19 минут
как всегда разобрался сам методом тыка:

Visual Basic
1
AD.Open "SELECT * FROM `USERS` WHERE `Фамилия` & `Имя` & `Отчество` LIKE '%иван%' ", oCn, adOpenDynamic, adLockPessimistic
0
Заблокирован
21.12.2013, 19:42
Ваш код можно хорошенько урезать.
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
22.12.2013, 15:03  [ТС]
Спрашивающий,
например?
0
Заблокирован
22.12.2013, 21:01
Bati4eli, Вот ты каждый раз создаешь подключение к базе, потом его закрываешь. Можно открыть 1 раз и не закрывать его на протяжении всего времени работы с БД. Потом всего 1 строкой посылать запрос к БД, а не писать все по 4 строки. Зачем ты постоянно создаешь RecordSet потом выполняешь с помощью него запрос, если тебе к примеру данные вовсе не нужны, а лишь выполнить запрос только, к примеру на вставку записей в БД.

Выложи исходник, я тебе примерно покажу как.
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
23.12.2013, 09:52  [ТС]
Вот к примеру функция использующаяся в серверной части моего приложения. Эта функция собирает по порядку части сообщений (например если оно длиной было более 255 символов). Т.е. рекордсет AD собирает все строки где Number_Part=1 (номер части сообщения равен 1), а потом AD2 находит остальные части этого сообщения.
Вообщем считаю, что по большей части занимаюсь дебилизмом и давно надо уже переходить на базы с расширением "accdb" .

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub SendOFF(Index As Long)
Dim Log As String, dDate As Date
Dim Comm As String, KEY As String
 
Log = sockMain(Index).Tag
 
Dim AD As ADODB.Recordset
Dim AD2 As ADODB.Recordset
Set AD = New ADODB.Recordset
Set AD2 = New ADODB.Recordset
Dim oCn As ADODB.Connection
Set oCn = New ADODB.Connection
oCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & App.Path & "\DB.mdb ;Jet OLEDB:Database Password=2135962"
oCn.Open
AD.CursorLocation = adUseClient
AD.Open "SELECT * FROM `Offline_msgs` WHERE `Log_TO`='" & Log & "' AND `Number_Part`=1", oCn, adOpenDynamic, adLockPessimistic
AD.Sort = "dDate"
Do While Not AD.EOF
    Comm = AD.Fields("Command").Value
    KEY = AD.Fields("KEY").Value
    dDate = AD.Fields("dDate").Value
    AD2.CursorLocation = adUseClient
    AD2.Open "SELECT * FROM `Offline_msgs` WHERE `KEY_OfFirst`=" & KEY, oCn, adOpenDynamic, adLockPessimistic
    AD2.Sort = "Number_Part"
    Do While Not AD2.EOF
        Comm = Comm & AD2.Fields("command").Value
        AD2.MoveNext
    Loop
    
    OBRABOTCHIK Comm, Index, dDate
    
    AD2.Close
    AD.MoveNext
Loop
AD.Close
End Sub
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
23.12.2013, 10:07  [ТС]
Прикрепляю БД:
Вложения
Тип файла: zip DB.zip (25.2 Кб, 5 просмотров)
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
23.12.2013, 10:36  [ТС]
Спрашивающий, буду признателен если поможете оптимизировать работу с бд =)
0
Заблокирован
23.12.2013, 15:12
Bati4eli, Тонкого клиента делать на Access это извращение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2013, 15:12
Помогаю со студенческими работами здесь

Использование псевдопеременных: bd (3,5) = s, где bd - база данных, s - элемент базы данных, тогда с 3 по 5 элементы базы данных заменить на элемент s.
всем доброго времени суток! есть у меня класс bd, массив элементов этого класса table, а вот сам метод: int copyTable(int a, int b) {...

Ссылка в запросе на тип данных из другой базы данных
Всем, доброго времени суток. На роботе столкнулся с такой проблемой: у меня есть две базы данных к первой (DB1) у меня есть доступ только...

Изменение базы данных-источника в запросе
Здравствуйте! На рисунке обведено свойство запроса. Подскажите пожалуйста, как его изменять программно или в запросе через функцию,...

Использование данных из DateTimePicker в SQL запросе Query
есть таблице парадокс с полями типа Date. надо сделать отчёт в QuickReport записей в выбраном промежутке дат. Просто так вывод таблицы...

Программа виснет при запросе данных из базы Firebird
Здравствуйте. Пытаюсь запросом выбрать большое количество данных из базы Firebird в DataGridView но при обработке программа зависает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru