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

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

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

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

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

Как я понимаю, вместо пятёрки в выводе должен быть какой-то хитрый sql запрос? Просвятите, пожалуйста.
Миниатюры
Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль   Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2015, 20:18
Ответы с готовыми решениями:

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

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

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

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

16
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
28.03.2015, 09:13 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
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
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
28.03.2015, 18:32 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Работает, спасибо! Только у меня просьба, ты не мог бы краткие комментарии по коду сделать?

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

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

Решение

Вообще лучше черпать из первоисточника. Поэтому несколько цитат из MSDN:
CDaoRecordset Class - представляет набор записей выбраных (т.е. полученных) из источника данных.
CDaoRecordset::MoveFirst - делает первую запись текущей.
CDaoRecordset::GetFieldValue - получает данные из набора (т.е. рекордсета)
Тут описано подробнее.
1
1 / 1 / 0
Регистрация: 10.11.2011
Сообщений: 85
28.03.2015, 22:38  [ТС] 7
А как 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
Эксперт по математике/физике
4217 / 3412 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 05:32 8
Найдено в 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  [ТС] 9
На первый вариант ругается, что "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
Эксперт по математике/физике
4217 / 3412 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
29.03.2015, 14:37 10
Цитата Сообщение от 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  [ТС] 11
Том Ардер, oVar BSTR = 0x013eead4 L"Object_1"

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

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

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

C++
1
2
    std::wstring wtest(V_BSTRT(&oVar));
    std::string str( wtest.begin(), wtest.end() );
Она, кажется, что-то делает, но cout'ом я строку почему-то вывести не могу...
0
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
29.03.2015, 23:07 16
у меня вот так получилось:
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  [ТС] 17
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
30.03.2015, 05:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2015, 05:44
Помогаю со студенческими работами здесь

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

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

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

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

Визуализация данных консольного приложения в форме
Доброго времени суток, господа! Нужен совет, ибо совсем запутался. Есть консольное приложение,...

Создать базу данных используя только возможности консольного приложения
Здравствуйте, нужна помощь по созданию базы данных используя только возможно консольного...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru