Форум программистов, компьютерный форум, киберфорум
C++: COM, OLE, ActiveX
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
1

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

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

Есть файл Parik.accdb (Оффис 2016г.), Винда х64, работаю в VS2019. Хочу написать приложение в С++, делающее запрос к БД и выводящее результат в консоль. С чего начать? Нужно ли установить какие-нибудь библиотеки, посмотреть, что показывает Администратор источника данных ODBC (или использовать не ODBC)? Какой шаблон проектов (пустое приложение, приложение MFC, консольное приложение) выбрать?
Являюсь начинающим программистом, возможно, не в тот раздел поместил тему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2020, 15:15
Ответы с готовыми решениями:

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

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

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

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

72
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
19.01.2020, 21:35  [ТС] 21
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
0
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
19.01.2020, 21:37 22
Цитата Сообщение от НВВ Посмотреть сообщение
Теперь остались ошибки в файле msado15.tlh. Попробую их игнорировать.
Какие?
0
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
19.01.2020, 21:39  [ТС] 23
Подставил "no_namespace rename("EOF","EoF")", ошибка в файле ado.tlh пропала, но выдало ошибку на ADODB:: Текст такой: C2653 ADODB: не является именем класса или пространства имен. Кстати, в коде ADODB:: не подчёркнуто.
0
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
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
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
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
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
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
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
19.01.2020, 22:09  [ТС] 27
Действительно, всё заработало! Если с подобной ерундой пришлось столько возиться, сколько же ещё скелетов впереди? Тема не закрыта, т.к. дальше буду присоединяться к БД, делать запрос, выводить на экран результат.
0
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
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
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
20.01.2020, 14:38  [ТС] 30
Иог, что-то не так?
0
Заблокирован
20.01.2020, 14:50 31
НВВ, молодцы, говорю.
0
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
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
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
21.01.2020, 15:06 33
Цитата Сообщение от НВВ Посмотреть сообщение
выдало ошибку: "Не удается найти указанный поставщик. Вероятно, он установлен неправильно." Что делать?
У MsAccess вроде другая ConnectionString

Добавлено через 3 минуты
http://www.sqlstrings.com/ms-a... trings.htm
1
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
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
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
21.01.2020, 15:39 35
Цитата Сообщение от НВВ Посмотреть сообщение
Пробовал подсоединять Parik.accdb, та же ошибка: "Нераспознаваемый формат базы данных...".
Создай на рабочем столе пустой текстовый файл. Потом переименуй его, чтобы было расширение .udl - например test.udl. Запусти. Тогда сможешь тестировать ConnectionString без c++

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

Добавлено через 5 минут
Открыл этот файл через Visual studio, запустил исплнение кода, но файл остался пустым.
0
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
21.01.2020, 15:48 37
Цитата Сообщение от НВВ Посмотреть сообщение
Какой программой запустить test.udl?
просто ткни на него, он запустится
0
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
21.01.2020, 15:49  [ТС] 38
Это я пробовал, у меня появилось окно с предложением, какой программой открыть файл.
0
5976 / 4006 / 1645
Регистрация: 07.05.2019
Сообщений: 12,481
Записей в блоге: 1
21.01.2020, 15:49 39
Либо Open With -> OLE DB Core Services
0
11 / 7 / 5
Регистрация: 12.01.2020
Сообщений: 95
21.01.2020, 15:56  [ТС] 40
У меня нет при нажатии "открыть с помощью" предложения OLE DB Core Services
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2020, 15:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.