M
M
meow332019-01-14 09:46:50
C++ / C#
meow33, 2019-01-14 09:46:50

Error C2227 when working with ADODB, I don't understand what's wrong?

I am writing a program to work with the ACCESS database, an error has come out


Error C2227 expression to the left of "->QueryInterface" must be a class, struct, or union type, or a generic type Project1 c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.13.26128 \include\comip.h 846

sends to this method
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;
    }

to this line
hr = p->QueryInterface(GetIID(), reinterpret_cast<void**>(&pInterface));

I don't understand what he wants from me, help.
Below is code written half by me, half by a teacher.
#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;
}

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question