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

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

27.03.2015, 20:18. Показов 3335. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru