25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419

Работа с БД: с чего начать

12.01.2020, 15:15. Показов 43630. Ответов 72
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть файл Parik.accdb (Оффис 2016г.), Винда х64, работаю в VS2019. Хочу написать приложение в С++, делающее запрос к БД и выводящее результат в консоль. С чего начать? Нужно ли установить какие-нибудь библиотеки, посмотреть, что показывает Администратор источника данных ODBC (или использовать не ODBC)? Какой шаблон проектов (пустое приложение, приложение MFC, консольное приложение) выбрать?
Являюсь начинающим программистом, возможно, не в тот раздел поместил тему.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2020, 15:15
Ответы с готовыми решениями:

работа с графикой. с чего начать?
Итак,есть консольный морской бой. Возможно ли сделать на него графическую оболочку и что для этого надо? как это все между собой связать?...

Работа с API. С чего начать?
Всем привет! Мне надо написать скрипт который работает с другим сайтом с помощью API. Так как я раньше этим на занимался, хочу...

Дипломная работа. С чего начать ?
Привет всем. Получил тему дипломной работы. Построение информационного словаря признаков для распознавания объектов. Подскажите...

72
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
19.01.2020, 21:35  [ТС]
Author24 — интернет-сервис помощи студентам
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.01.2020, 21:37
Цитата Сообщение от НВВ Посмотреть сообщение
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
Какие?
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
19.01.2020, 21:39  [ТС]
Подставил "no_namespace rename("EOF","EoF")", ошибка в файле ado.tlh пропала, но выдало ошибку на ADODB:: Текст такой: C2653 ADODB: не является именем класса или пространства имен. Кстати, в коде ADODB:: не подчёркнуто.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.01.2020, 21:42
Цитата Сообщение от НВВ Посмотреть сообщение
Подставил "no_namespace rename("EOF","EoF")", ошибка в файле ado.tlh пропала, но выдало ошибку на ADODB:: Текст такой: C2653 ADODB: не является именем класса или пространства имен. Кстати, в коде ADODB:: не подчёркнуто.
no_namespace и rename это две разные опции. Можно их использовать по отдельности.
C++
1
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" rename("EOF","EoF")
1
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
19.01.2020, 21:51  [ТС]
Подставил ещё одну строку с rename, а в аналогичной "rename" удалил, получилось:
C++
1
2
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace ("EOF","EoF")
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" rename("EOF","EoF")
Ошибка с ADODB:: не пропала. Какая-то безнадёга. Может, попробовать с самого начала новый проект?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.01.2020, 21:54
Цитата Сообщение от НВВ Посмотреть сообщение
Ошибка с ADODB:: не пропала. Какая-то безнадёга. Может, попробовать с самого начала новый проект?
C++
1
2
//#import "c:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace ("EOF","EoF")
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" rename("EOF","EoF")
Добавлено через 1 минуту
Директива #import
1
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
19.01.2020, 22:09  [ТС]
Действительно, всё заработало! Если с подобной ерундой пришлось столько возиться, сколько же ещё скелетов впереди? Тема не закрыта, т.к. дальше буду присоединяться к БД, делать запрос, выводить на экран результат.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
20.01.2020, 14:13  [ТС]
Сейчас код такой:
C++
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
#include <iostream>
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" rename("EOF","EoF")
 
ADODB::_ConnectionPtr pConnection = NULL;
ADODB::_CommandPtr pCommand = NULL;
ADODB::_RecordsetPtr pRSet = NULL;
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
    try {
        pConnection->Open(_bstr_t(L"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=d:\\Parik.mdb;"), _bstr_t(""), _bstr_t(""), 0);
        
 
        pCommand->ActiveConnection = pConnection;
        pCommand->CommandText = "Select Firm From Enterprise";
 
        pRSet->Open(pCommand->CommandText, &pConnection, adOpenStatic, adLockOptimistic, adCmdUnknown);
        //pRSet->Open(pCommand, vtMissing, adOpenStatic, adLockOptimistic, adCmdUnknown);
        //pRSet->Open(pCommand->CommandText, &pConnection, _bstr_t(""), _bstr_t(""), 0);
        //pRSet->Open(pCommand->CommandText, &pConnection, "adOpenStatic", "adLockOptimistic", 0);
        //pRSet->Open(pCommand->CommandText, &pConnection,3,3, 0);
        cout << "Список предприятий: " << pRSet->Index << endl;
        return 0;
    }
    catch (_com_error & e)
    {
        cout << "Где-то ошибка!" << endl;
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());
    }
 
    return 0;
}
В строке, где pRSet->Open, выдаётся ошибка: Ошибка C2664 "HRESULT ADODB::Recordset15::Open(const _variant_t &,const _variant_t &,ADODB::CursorTypeEnum,ADODB::LockTypeE num,long)": невозможно преобразовать аргумент 3 из "_bstr_t" в "ADODB::CursorTypeEnum"
Перепробовал разные варианты, они здесь же, в коде закомментированы.

Добавлено через 5 минут
Сделал вот так и всё заработало:
C++
1
pRSet->Open(pCommand->CommandText, &pConnection, ADODB::CursorTypeEnum(3), ADODB::LockTypeEnum(3), 0);
0
Заблокирован
20.01.2020, 14:32
Артисты.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
20.01.2020, 14:38  [ТС]
Иог, что-то не так?
0
Заблокирован
20.01.2020, 14:50
НВВ, молодцы, говорю.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 14:54  [ТС]
Как я и думал, рано пить шампанское. Сейчас код такой:
C++
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
#include "DBConn.h"
#include <iostream>
using namespace std;
#import "c:/Program Files/Common Files/System/ADO/msado15.dll" rename("EOF","EoF")
 
ADODB::_ConnectionPtr pConnection = NULL;
ADODB::_CommandPtr pCommand = NULL;
ADODB::_RecordsetPtr pRSet = NULL;
 
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
    // устанвливаем русскую локаль для консоли
    setlocale(LC_ALL, "Russian");
 
    ::CoInitialize(NULL);
            try {
                HRESULT hr = pConnection.CreateInstance((__uuidof(ADODB::Connection)));
                hr = pConnection->Open(("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=d:\\Parik.mdb;"), _bstr_t(""), _bstr_t(""), 0);
        
        
    catch (_com_error &e)
    {
        //Получаем ошибку из _com_error
        cout << "Где-то ошибка!" << "\n";
        
    }
 
    return 0;
}
Часть кода убрал для читабельности. Итак, после команды pConnection->Open выполнение программы переходит в файл msado15.thl:
C++
1
2
3
4
5
inline HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) {
    HRESULT _hr = raw_Open(ConnectionString, UserID, Password, Options);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _hr;
}
Когда доходит дело до строки if (FAILED(_hr)) появляется соообщение: comsupp.cpp не найден. Понимаю, что её надо перехватить и выяснить, в чём дело. Как это сделать? Проблема, видимо, в неправильности аргументов в команде для создания подключения.

Добавлено через 4 минуты
Сделал вот так:
C++
1
cout << "Где-то ошибка!" << e.Description() << "\n";
выдало ошибку: "Не удается найти указанный поставщик. Вероятно, он установлен неправильно." Что делать?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.01.2020, 15:06
Цитата Сообщение от НВВ Посмотреть сообщение
выдало ошибку: "Не удается найти указанный поставщик. Вероятно, он установлен неправильно." Что делать?
У MsAccess вроде другая ConnectionString

Добавлено через 3 минуты
http://www.sqlstrings.com/ms-a... trings.htm
1
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 15:32  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У MsAccess вроде другая ConnectionString
Я пробовал раньше Microsoft.Jet.OLEDB.4.0, когда была другая ошибка, а сейчас забыл это попробовать, спасибо! Теперь текст ошибки: "Нераспознаваемый формат базы данных: 'd:\Parik.mdb'" Изначально файл Parik.mdb был Parik.accdb, я его сохранил в формате .mdb. Попробую покумекать дальше.

Добавлено через 6 минут
Пробовал подсоединять Parik.accdb, та же ошибка: "Нераспознаваемый формат базы данных...".
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.01.2020, 15:39
Цитата Сообщение от НВВ Посмотреть сообщение
Пробовал подсоединять Parik.accdb, та же ошибка: "Нераспознаваемый формат базы данных...".
Создай на рабочем столе пустой текстовый файл. Потом переименуй его, чтобы было расширение .udl - например test.udl. Запусти. Тогда сможешь тестировать ConnectionString без c++

Добавлено через 2 минуты
Выбери там провайдера, заполни вкладку connection, нажми Test connection и Ок. Потом сделай Open With Notepad, там будет connectionString
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 15:47  [ТС]
Какой программой запустить test.udl?

Добавлено через 5 минут
Открыл этот файл через Visual studio, запустил исплнение кода, но файл остался пустым.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.01.2020, 15:48
Цитата Сообщение от НВВ Посмотреть сообщение
Какой программой запустить test.udl?
просто ткни на него, он запустится
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 15:49  [ТС]
Это я пробовал, у меня появилось окно с предложением, какой программой открыть файл.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.01.2020, 15:49
Либо Open With -> OLE DB Core Services
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 15:56  [ТС]
У меня нет при нажатии "открыть с помощью" предложения OLE DB Core Services
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2020, 15:56
Помогаю со студенческими работами здесь

Работа с изображениями, с чего начать?
Подскажите, пожалуйста, необходимо реализовать сжатие изображения из формата bmp в jpeg, никогда с этим не встречался, не подскажите ли вы...

Работа в интернете, с чего начать?
всем здрасте :) я вот решил занятся заработком в интернете, но не знаю с чего лучше начать. знаю что лв можно сделать на сайте, рекламе,...

Работа со структурами, подскажите с чего начать
Здравствуйте, знатоки ,мне нужна ваша помощь :) Вообщем, мне надо сделать лабораторную по структурам : Создать массив структур...

Работа со списками, подскажите с чего начать
Работа со списками: в списке целых чисел удалить из каждой группы подряд идущих одинаковых элементов все, кроме одного.

Работа с файлами,чтение/запись, не знаю даже с чего начать
У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
C++26: Индексирование пакетов и метапрограммиро­вание
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru