Пишу программу для работы с БД ACCESS, вылезла ошибка
Ошибка C2227 выражение слева от "->QueryInterface" должно указывать на тип класса, структуры или объединения либо на универсальный тип Проект1 c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.13.26128\include\comip.h 846
отправляет в этот метод
template<typename _InterfacePtr> HRESULT _QueryInterface(_InterfacePtr p) throw()
{
HRESULT hr;
// Can't QI NULL
//
if (p != NULL) {
// Query for this interface
//
Interface* pInterface = NULL;
hr = p->QueryInterface(GetIID(), reinterpret_cast<void**>(&pInterface));
// Save the interface without AddRef()ing.
//
Attach(SUCCEEDED(hr)? pInterface: NULL);
}
else {
operator=(static_cast<Interface*>(NULL));
hr = E_NOINTERFACE;
}
return hr;
}
на эту строку
hr = p->QueryInterface(GetIID(), reinterpret_cast<void**>(&pInterface));
Вообще не понимаю что он хочет от меня, хелп.
Ниже код, написанный наполовину мной, наполовину преподавателем.
#include<iostream>
#include<comdef.h>
#include<Windows.h>
#include <string>
#include<iomanip>
#include<conio.h>
#import<C:\\Users\\falab\\Desktop\\ADO в C++\\Проект1\\Debug\\msado15.dll> rename ("EOF","AdoNSEOF")
using namespace std;
using namespace ADODB;
//const _bstr_t CONTACTS = "contacts.accdb";
//const _bstr_t CARS = "cars.accdb";
class Database {
_ConnectionPtr pConn="ADODB.Connection";//указатель на соединение из пространства ADODB::
_RecordsetPtr pRS="ADODB.Recordset";//указатель на запись в таблице из пространства ADODB::
_bstr_t strConnect = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Users\\falab\\Desktop\\ADO в C++\\contacts.accdb";
HRESULT hr;
public:
_bstr_t query;
Database(_bstr_t strConnect) {
strConnect = this->strConnect;
};
Database() {};
void Connect()
{ //устанавливаем соединение
this->hr = pConn->Open(strConnect, "admin", "", ADODB::adConnectUnspecified);
try {
if (!SUCCEEDED(hr)) throw string("Ошибка подключения");
cout << "Успешное подключение" << endl;;
}
catch (string str) {
cout << str << endl;
}
}
void Close()
{
pConn->Close(); //закрытие соединения
}
void Query()
{ //Устанавливаем указатель на первую запись данных запроса
//IDispath интерфейс, на котором держится автоматизация COM
this->hr = pRS->Open(this->query, _variant_t((IDispatch *)pConn, true),
ADODB::adOpenUnspecified, ADODB::adLockUnspecified, ADODB::adCmdText);
if (SUCCEEDED(hr))
{
cout << "SQL запрос: \"" << this->query << "\"" << endl;
//указатель на поля в записи
ADODB::Fields* pFields = NULL;
this->hr = pRS->get_Fields(&pFields);
//выводятся заголовки полей из запроса к БД
for (int i = 0; i < 57; i++) {
cout << "-";
} cout << endl;
if (SUCCEEDED(hr) && pFields && pFields->GetCount() > 0)
{
for (long nIndex = 0; nIndex < pFields->GetCount(); nIndex++)
cout << _bstr_t(pFields->GetItem(nIndex)->GetName()) << "\t";
cout << endl;
}
else
cout << "Ошибка данных в запросе" << endl;
//выводятся вывод всех значения полей из запроса к БД
for (int i = 0; i < 57; i++) {
cout << "-";
} cout << endl;
while (!pRS->AdoNSEOF)
{
for (long nIndex = 0; nIndex < pFields->GetCount(); nIndex++)
cout << _bstr_t(pFields->GetItem(nIndex)->GetValue()) << "\t";
cout << endl;
pRS->MoveNext();
}
for (int i = 0; i < 57; i++) {
cout << "-";
} cout << endl;
cout << "Количество записей " << pFields->GetCount() << endl;
}
}
};
int main(int argc, TCHAR *argv[])
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
setlocale(LC_ALL, "Russian");
_bstr_t query;
string query1;
Database myDatabase;
system("cls");
try
{
/*инициализация среды COM*/
if (FAILED(CoInitialize(nullptr)))
throw runtime_error("Не удается инициализировать COM среду");
myDatabase.Connect(); //Вызов функции соединения
//запрос на выборку всех строк из таблицы contacts
getline(cin, query1);
myDatabase.query = query1.c_str();
myDatabase.Query(); //вызов функции выполнении запроса
myDatabase.Close(); //вызов функции отключения
CoUninitialize(); //выгрузка среды COM
}
catch (runtime_error &s)
{
cout << s.what();
}
system("title Работа с БД через ADO");
//system("cls");
_getch();
return 0;
}