Задать вопрос
@meow33

Ошибка C2227 при работе с ADODB, не понимаю что не так?

Пишу программу для работы с БД 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;
}
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы