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

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

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

Author24 — интернет-сервис помощи студентам
Есть файл Parik.accdb (Оффис 2016г.), Винда х64, работаю в VS2019. Хочу написать приложение в С++, делающее запрос к БД и выводящее результат в консоль. С чего начать? Нужно ли установить какие-нибудь библиотеки, посмотреть, что показывает Администратор источника данных ODBC (или использовать не ODBC)? Какой шаблон проектов (пустое приложение, приложение MFC, консольное приложение) выбрать?
Являюсь начинающим программистом, возможно, не в тот раздел поместил тему.
0
12.01.2020, 15:15
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  [ТС] 21
Author24 — интернет-сервис помощи студентам
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.01.2020, 21:37 22
Цитата Сообщение от НВВ Посмотреть сообщение
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
Какие?
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
19.01.2020, 21:39  [ТС] 23
Подставил "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 24
Цитата Сообщение от НВВ Посмотреть сообщение
Подставил "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  [ТС] 25
Подставил ещё одну строку с 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 26
Цитата Сообщение от НВВ Посмотреть сообщение
Ошибка с 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  [ТС] 27
Действительно, всё заработало! Если с подобной ерундой пришлось столько возиться, сколько же ещё скелетов впереди? Тема не закрыта, т.к. дальше буду присоединяться к БД, делать запрос, выводить на экран результат.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
20.01.2020, 14:13  [ТС] 28
Сейчас код такой:
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::LockTypeEnum,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 29
Артисты.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
20.01.2020, 14:38  [ТС] 30
Иог, что-то не так?
0
Заблокирован
20.01.2020, 14:50 31
НВВ, молодцы, говорю.
0
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 14:54  [ТС] 32
Как я и думал, рано пить шампанское. Сейчас код такой:
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 33
Цитата Сообщение от НВВ Посмотреть сообщение
выдало ошибку: "Не удается найти указанный поставщик. Вероятно, он установлен неправильно." Что делать?
У MsAccess вроде другая ConnectionString

Добавлено через 3 минуты
http://www.sqlstrings.com/ms-a... trings.htm
1
25 / 12 / 5
Регистрация: 12.01.2020
Сообщений: 419
21.01.2020, 15:32  [ТС] 34
Цитата Сообщение от 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 35
Цитата Сообщение от НВВ Посмотреть сообщение
Пробовал подсоединять 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  [ТС] 36
Какой программой запустить test.udl?

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

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

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

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

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

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


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Пользуясь нейросетью возвращаюсь к вопросу альтернативных приводов поступательного движения.
Hrethgir 14.02.2025
Описание тут https:/ / habr. com/ ru/ articles/ 778118/ . Вопрос ответ You Привет. Скажи, есть-ли вещества, которые могут менять жидкое состояние на желеобразное под воздействием ультразвука? . . .
Ошибка "Another git process seems to be running in this repository"
hw_wired 14.02.2025
При работе с git можно столкнуться с довольно раздражающей ошибкой "Another git process seems to be running in this repository". Эта ситуация возникает, когда система контроля версий пытается. . .
Ошибка "java.lang.NoCl­assDefFou­ndErro­r: javax/xml/bind/JAXBException"
hw_wired 14.02.2025
Как разработчики Java-приложений, мы сталкиваемся с разными ошибками, но одна из них - java. lang. NoClassDefFoundError: javax/ xml/ bind/ JAXBException - стала особенно актуальной после выхода Java 9. . . .
Отличия for-in от for-of в JavaScript
hw_wired 14.02.2025
Когда-то единственным способом перебора элементов массива или свойств объекта был классический цикл for с счетчиком. Да, он отлично справлялся с задачей, но код получался громоздким и не очень. . .
Отличия implementation, api и compile в Gradle
hw_wired 14.02.2025
Управление зависимостями - одна из ключевых задач при разработке современных приложений на Java и Kotlin. Система сборки Gradle предоставляет гибкие и мощные средства для работы с зависимостями,. . .
Что лучше: require или import/export в JavaScript
hw_wired 14.02.2025
Модульность в JavaScript прошла долгий путь эволюции, и сегодня у разработчиков есть два основных способа организации модулей: старый добрый require из системы CommonJS и современные import/ export из. . .
Ошибка "Uncaught SyntaxError: Cannot use import statement outside a module"
hw_wired 14.02.2025
Думаю, многие разработчики сталкивались с ошибкой "Uncaught SyntaxError: Cannot use import statement outside a module" при попытке использовать современный синтаксис импорта в JavaScript. Эта. . .
Ошибка Docker "Got permission denied while trying to connect to the Docker daemon socket at"
hw_wired 14.02.2025
Разработка с использованием Docker может иногда преподносить неожиданные сюрпризы, и одним из самых распространенных камней преткновения становится ошибка с отказом в доступе к демону Docker. . . .
Ошибка "No 'Access-Control-Allow-Origin' header is present on the requested resource"
hw_wired 14.02.2025
При разработке современных веб-приложений нередко сталкиваешься с ошибкой "No 'Access-Control-Allow-Origin' header is present on the requested resource". Эта проблема возникает из-за политики. . .
Как закрыть порт в Linux
hw_wired 14.02.2025
Управление сетевыми портами в Linux - непростая, но важная задача для обеспечения безопасности системы. Каждый открытый порт - это потенциальная уязвимость, через которую злоумышленики могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru