Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85

Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль

27.03.2015, 20:18. Показов 3312. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть есть таблица TestDB c единственной таблицей Table_1 с двумя полями: ключевым текстовым полем key и числовым полем data.

Задача - средствами MVS 2012 взять из поля data со значением ключа bMax число 220 и вывести в консоль.

Как я понимаю, вместо пятёрки в выводе должен быть какой-то хитрый sql запрос? Просвятите, пожалуйста.
Миниатюры
Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль   Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2015, 20:18
Ответы с готовыми решениями:

Работа с асинхронным выводом консольного приложения (строковые переменные)
Для начала скажу, что в програмировании полный нуб - просто, иногда по работе без этого не обойтись... Поэтому прошу, по возможности,...

Подключение к БД из консольного приложения
Есть консольное приложение. Нужно чтобы оно подключалось в БД Microsoft Access. Как это реализовать?

Можно ли из консольного приложения вызвать еще одну консоль через функцию?
Если да, то в каком заголовке она лежит?

16
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
28.03.2015, 09:13
Лучший ответ Сообщение было отмечено Nicolazz как решение

Решение

Попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    CDaoDatabase db;
    db.Open(L"d:\\TestDB.mdb");
 
    CString sQuery = "SELECT Table_1.data FROM [Table_1]";
 
    CDaoRecordset rs(&db);
    rs.Open(dbOpenDynaset, sQuery);
 
    COleVariant oVar;
    rs.MoveFirst();
    rs.GetFieldValue(0, oVar);
    rs.Close();
    db.Close();
    cout << "Extracted: " << oVar.intVal << endl;
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
28.03.2015, 18:23  [ТС]
Error 1 error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afx.h 24
2 IntelliSense: #error directive: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afx.h 24

Не совсем понял ошибку. Версии не совпадают?
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
28.03.2015, 18:32
Лучший ответ Сообщение было отмечено Nicolazz как решение

Решение

в меню Project-> ... Properties->Configuration Properties->General
в пункте Use of MFC выбери "Use MFC in a Shared DLL"
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
28.03.2015, 18:41  [ТС]
Работает, спасибо! Только у меня просьба, ты не мог бы краткие комментарии по коду сделать?

Особенно вот эти два оператора интересуют

rs.MoveFirst();
rs.GetFieldValue(0, oVar);
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
28.03.2015, 18:53
Лучший ответ Сообщение было отмечено Nicolazz как решение

Решение

Вообще лучше черпать из первоисточника. Поэтому несколько цитат из MSDN:
CDaoRecordset Class - представляет набор записей выбраных (т.е. полученных) из источника данных.
CDaoRecordset::MoveFirst - делает первую запись текущей.
CDaoRecordset::GetFieldValue - получает данные из набора (т.е. рекордсета)
Тут описано подробнее.
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
28.03.2015, 22:38  [ТС]
А как string из БД вывезти? Я добавил новое поле name, занёс туда значение Object_1. Строка выглядит так:
C++
1
    CString sQuery = "SELECT Table_1.name FROM [Table_1] WHERE key = 'name'";
А выводит просто 8 чисел.

На что нужно заменить intVal?

Добавлено через 54 минуты
Пробовал так
C++
1
    cout << "Extracted: " << (LPCTSTR)(oVar.bstrVal) << endl;
Но выводит какой-то 16ричный код
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 05:32
Найдено в MSDN:
Следующий код показывает, как извлечь значение BSTR из COleVariant в CString:

C++
1
2
  COleVariant varName( _T( "MyName" ), VT_BSTRT );
  CString str = V_BSTRT( &varName );


Т.е. может работать так:
C++
1
cout << "Extracted: " << (LPCTSTR)V_BSTRT(oVar) << endl;
Пользуюсь ADO, гораздо удобнее. Там работает так, например:
C++
1
cout << (LPCTSTR)_bstr_t(rs.GetFields()->GetItem("Name")->GetValue()) << endl;
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
29.03.2015, 05:54  [ТС]
На первый вариант ругается, что "expression must have pointer type", пробовал давать на входе указатель, не помогло. По второму варианту ругается, что а) _bstr_t идентификатор не определён(действительно, откуда Вы его взяли?) и б) CDaoRecordset не имеет члена GetFields(). Есть вариант, как исправить? Вот код полный, если что:

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
#include <iostream>
#include <conio.h>
#include <afxdao.h>
 
using namespace std;
 
int main()
{
    CDaoDatabase db;
    db.Open(L"TestDB.mdb");
 
    CString sQuery = "SELECT Table_1.name FROM [Table_1] WHERE key = 'name'";
 
    CDaoRecordset rs(&db);
    rs.Open(dbOpenDynaset, sQuery);
 
    COleVariant oVar;
    rs.MoveFirst();
    rs.GetFieldValue(0, oVar);
    rs.Close();
    db.Close();
    cout << "Extracted: " << (LPCTSTR)_bstr_t(rs.GetFields()->GetItem("Name")->GetValue()) << endl;
//    cout << 5 << endl;
    _getch();
    return 0;
}
Хотя я не совсем понимаю, зачем тут выражение GetFields()->GetItem("Name")->GetValue(). Пробовал убрать - оставался вопрос с _bstr_t

Добавлено через 8 минут
Сработало так:

C++
1
    cout << "Extracted: " << (LPCTSTR)V_BSTRT(&oVar) << endl;
Но всё равно выводит вместо "Object_1" какой-то 16-ричный код из восьми цифр. Причём всегда разный.
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 14:37
Цитата Сообщение от Nicolazz Посмотреть сообщение
Сработало так:
Код C++
1
cout << "Extracted: " << (LPCTSTR)V_BSTRT(&oVar) << endl;
Правильно, это я сослепу пропустил &. Sorry

Всё остальное у меня было лишь для примера, как это работает в ADO, копировать текстуально в DAO не имеет смысла.
_bstr_t - класс-оболочка для типа BSTR, подробности в MSDN.

Возможная причина: кодировка (ANSI или UNICODE). Посмотрите отладчиком значение и тип переменной oVar перед выводом.
Вариант (сокращено):
C++
1
cout << (LPCSTR)V_BSTR(&oVar);
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
29.03.2015, 17:12  [ТС]
Том Ардер, oVar BSTR = 0x013eead4 L"Object_1"

Вот, собственно, программа этот адрес мне каждый раз и печатает. А текст-то как вывести?))
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 17:31
Nicolazz, можете выложить сюда свою базу и проект со всеми файлами?
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
29.03.2015, 19:42  [ТС]
Том Ардер, https://yadi.sk/d/aAdN5y3QfbZAY

Добавлено через 2 часа 4 минуты
Том Ардер, нет пока идей?
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 20:01
Nicolazz, пока нет. Создал новый проект, у меня более старые версии VS, база не открывается, ошибка Open, отлаживаю.
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
29.03.2015, 22:38  [ТС]
спасибо, что не бросаете)

Добавлено через 2 часа 30 минут
Том Ардер, а как насчёт такой вот конструкции?

C++
1
2
    std::wstring wtest(V_BSTRT(&oVar));
    std::string str( wtest.begin(), wtest.end() );
Она, кажется, что-то делает, но cout'ом я строку почему-то вывести не могу...
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
29.03.2015, 23:07
у меня вот так получилось:
C++
1
2
3
4
5
6
7
    ...
    cout << "Extracted: " << _bstr_t(oVar) << endl;
    rs.Close();
    db.Close();
    AfxDaoTerm();
 
    return 0;
Добавлено через 1 минуту
но для _bstr_t нужно:
C
1
#include "comutil.h"
и свойствах проекта линковщику указать: comsuppw.lib
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
30.03.2015, 05:44  [ТС]
rao, а можешь попробовать мой проект скомпилить? Ссылка тремя сообщениями выше. У меня постоянно ошибка компоновщика вылезает. Или полный код дай, я прямо не знаю....

Добавлено через 4 минуты
А поподробнее можно? Куда точно либ подключать?

Добавлено через 6 часов 27 минут
rao, Том Ардер, последняя подсказка rao очень помогла! Всё заработало! Всем огромное спасибо!!

Код:
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
#include <iostream>
#include <conio.h>
#include <afxdao.h>
#include <comutil.h>
#include <AtlBase.h>
#include <AtlConv.h>
 
using namespace std;
 
int main()
{
    CDaoDatabase db;
    db.Open(L"TestDB.mdb");
 
    CString sQuery = "SELECT Table_1.name FROM [Table_1] WHERE key = 'name'";
 
    CDaoRecordset rs(&db);
    rs.Open(dbOpenDynaset, sQuery);
 
    COleVariant oVar;
    rs.MoveFirst();
    rs.GetFieldValue(0, oVar);
    cout <<  _bstr_t(oVar) << endl;
    rs.Close();
    db.Close();
    AfxDaoTerm();
//  std::wstring wtest(V_BSTRT(&oVar));
//  std::string str( wtest.begin(), wtest.end() );//    
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2015, 05:44
Помогаю со студенческими работами здесь

Работа с Access 2007 из консольного приложения
Есть задумка поработать с существующей БД из консольного приложения. На странице:...

Access violation при закрытии любого консольного приложения
Добрый день. Недавно заметил, что при закрытии на красный крестик любого консольного приложения, написанного в C++ Builder XE все программы...

Подключение к MySql из консольного приложения (Android приложение C# Shell из Play Market)
Я пока что практикуюсь в базах MySql, и хотел написать консольное приложение, цель которого - просто подключиться к базе и выполнить...

Выборка всех данных с последующим выводом через Ajax
Добрый день. Подскажите как вывести все данные из выборки в AJAX. Код для вывода данных: var ViewModel = function () { var...

Получение данных из консольного приложения
Здравствуйте форумчане! Пожалуйста, подскажите . У меня такой вопрос. Я скачал примерчик из...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru