На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (8) « Первая ... 3 4 [5] 6 7 ... Последняя » все  ( Перейти к последнему сообщению )  
> Класс-обертка на чистом С++ , Для использования Ф-ий DLL
    Не указал имя класса, для всех методов, CStatement:: .................
      вот еще не могу пройти
      ExpandedWrap disabled
        СерьезностьКодОписаниеПроектФайлСтрокаСостояние подавления
        Ошибка (активно)namespace "std" не содержит члена "vector"HyTech \Statement.h34


      Добавлено
      Цитата Олег М @
      Не указал имя класса, для всех методов, CStatement:: .................

      да это я уже догнал
        Цитата kms @
        вот еще не могу пройти

        Сделай #include <vector>
          все равно ругается на файл
          Statement.h
          ExpandedWrap disabled
                class CStatement
                {
                public:
                    
                    CStatement(CConnection  & idConnect,   const char *strSqlQuery )
                        : idOperator(0)
                        , sumColumns(0)
                        , sumRows(0)
                        , pRecSize(0)
                        ;

          вот такие ошибки
          ExpandedWrap disabled
             
            ОшибкаC2969синтаксическая ошибка: ;: требуется определение функции-члена до "}"HyTech \statement.h23
            Ошибка (активно)требуется фигурная скобка "{"HyTech \Statement.h23
            ОшибкаC2061синтаксическая ошибка: идентификатор "CConnection"HyTech \statement.h18
            Покажи файлы
              убрал в файле Statement.h
              ExpandedWrap disabled
                : idOperator(0)
                    , sumColumns(0)
                    , sumRows(0)
                    , pRecSize(0)

              а в файле Statement.cpp оставил



              теперь 3 ошибки
              ExpandedWrap disabled
                СерьезностьКодОписаниеПроектФайлСтрокаСостояние подавления
                ОшибкаC2061синтаксическая ошибка: идентификатор "CConnection"HyTech \statement.h18
                ОшибкаC2065sumColumns: необъявленный идентификаторHyTech \statement.cpp76
                ОшибкаC2065infoColumns: необъявленный идентификаторHyTech \statement.cpp76


              Добавлено
              ругается вот на это
              ExpandedWrap disabled
                const hcSqlDstInfoT CStatement::*GetColInfo(int idx)  
                {
                    return idx < sumColumns ? infoColumns[idx] : nullptr;
                }
                Сделай уже заголовки, как я говорил. Проблема в этом
                  Цитата Олег М @
                  Сделай уже заголовки, как я говорил. Проблема в этом

                  нет , перепроверил несколько раз переставлял по разному, всякие варианты перепробовал , заголовки не влияют на это
                  не принимает вот эту конструкцию
                  ExpandedWrap disabled
                     CStatement(CConnection  & idConnect,   const char *strSqlQuery )
                                : idOperator(0)
                                , sumColumns(0)
                                , sumRows(0)
                                , pRecSize(0)
                                ;

                  не хочет брать и все

                  вообщем я покамест убрал это и сделал вот так

                  main.cpp
                  Скрытый текст

                  ExpandedWrap disabled
                    #include "HyTech.h"
                     
                    void main()
                    {
                            setlocale(LC_ALL, "");
                            
                            CConnection Conect1 ;
                            
                            Conect1.Connect("tcpip:/localhost:13000" , "HTADMIN" , "PASSWORD");
                     
                            CStatement  Query1(Conect1, "fix all; select * from TAB4;")  ;
                     
                            std::cout << "Кол-во столбцов          = "  << Query1.GetColumns() << std::endl;
                            std::cout << "Кол-во строк             = "  << Query1.GetRows()    << std::endl ;
                            std::cout << "Размер одной строки      = "  << Query1.GetRowSize() << std::endl;
                     
                            std::cout << "Размер приемного массива = "  << Query1.GetRows() * Query1.GetRowSize() << std::endl;
                     
                            std::vector<char>  masResult(Query1.GetRows() * Query1.GetRowSize()); // делаем массив для приема результата
                     
                            masResult = Query1.ReadResults(0, Query1.GetRows() );
                            
                            for (int i = 0; i < Query1.GetRows(); i++)
                            {
                                    std::cout << masResult[i]  << std::endl ;
                            }
                            
                            std::system("pause") ;
                    }


                  Прикреплённая картинка
                  Прикреплённая картинка


                  Добавлено
                  Скрытый текст


                  HyTech.h
                  ExpandedWrap disabled
                    #pragma once
                     
                    #define HYCFG_WIN32
                     
                    #include <iostream>
                    #include <memory>
                    #include <vector>
                     
                    #include "HSCLI.H"
                     
                    #include "Connection.h"
                    #include "Statement.h"
                     
                    #define SIZE_HCSQLDSTINFOT      128


                  Connection.h
                  ExpandedWrap disabled
                    #pragma once
                     
                    #define HYCFG_WIN32
                     
                    #include "HyTech.h"
                     
                     
                        class CConnection
                        {
                           public:
                            CConnection();
                            ~CConnection();
                     
                            void Connect(const char *server, const char *user, const char *password);
                            
                            void Disconnect() noexcept;
                            
                            operator hcHDB() const
                            {
                                return idConnect;
                            }
                     
                          protected:
                              hcHDB  idConnect = 0; // Адрес памяти, куда будет записан идентификатор соединения.  hcHDB pdb;
                     
                        };


                  Connection.cpp
                  ExpandedWrap disabled
                    #define HYCFG_WIN32
                     
                    #include "HyTech.h"
                     
                        CConnection::CConnection()
                        {
                            hcSqlParmT Init = { sizeof(Init) }; // Адрес структуры с параметрами инициализации
                                              
                            if ( hcSqlInit(&Init) != 0 ) // Инициализация клиентской части
                                throw std::runtime_error("hcSqlInit failed");
                     
                            if (hcSqlCheckInit() != 0)   // Проверка завершения инициализации
                                throw std::runtime_error("hcSqlCheckInit failed");
                            
                            if (hcSqlAllocConnect(&idConnect) != 0) //  Создать соединение
                                throw std::runtime_error("hcSqlAllocConnect failed");
                        }
                     
                        CConnection::~CConnection()
                        {
                            Disconnect();
                            hcSqlFreeConnect(idConnect); // Освободить соединение
                            hcSqlDone();                 // Завершение работы
                        }
                     
                        void CConnection::Connect(const char * server, const char * user, const char * password)
                        {
                            const auto err = hcSqlConnect(idConnect, server, user, password);
                            if (err != 0)
                                throw std::runtime_error("hcSqlConnect failed");
                        }
                     
                        void CConnection::Disconnect() noexcept
                        {                               // Разорвать связь с сервером БД
                            hcSqlDisconnect(idConnect); // Рекомендуется полностью освободить все операторы,
                        }                               // выделенные для idConnect указанного соединения.


                  //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

                  Statement.h
                  ExpandedWrap disabled
                    #pragma once
                     
                    #define HYCFG_WIN32
                     
                    #include "HyTech.h"
                     
                    class CStatement
                    {
                    public:
                     
                        CStatement(CConnection  & idConnect, const char *strSqlQuery); // Конструктор на входе "идентификатор соединения" и "строка SQL-запроса"
                     
                        ~CStatement();
                        
                        int      GetColumns() ; // Возвращает кол-во колонок
                        long     GetRows()    ; // Возвращает кол-во строк
                        unsigned GetRowSize() ; // Возвращает размер строки в байтах (сумма всех размеров полей)
                        
                        std::vector<char> ReadResults(long start, size_t n) ; // Чтение результата
                     
                    protected:
                     
                        hcHSTMT  idOperator; // Адрес памяти, куда будет записан идентификатор созданного оператора.
                     
                        int      sumColumns; // кол-во колонок  результата
                        long     sumRows;    // кол-во строк    результата
                        unsigned pRecSize;   // Размер читаемой записи в байтах, в ф-ции  "Открытие результатов для чтения" .
                        unsigned cntOp;      // Размер считанной информации в байтах, в ф-ции "Получить информацию об операторе".  Если это кол-во разделить на размер значения, то можно получить кол-во считанных значений(для параметров, которые имеют массив значений).
                     
                        std::unique_ptr<hcSqlDstInfoT[]> infoColumns; // Структура "Информация о колонках результата"
                      
                    };


                  Statement.cpp
                  ExpandedWrap disabled
                    #define HYCFG_WIN32
                     
                    #include "HyTech.h"
                     
                    CStatement::CStatement(CConnection  & idConnect, const char *strSqlQuery)// Конструктор
                    {
                        if (hcSqlAllocStmt(idConnect, &idOperator) != 0) // ф-ция hscli.dll "Создать оператор"
                            throw std::runtime_error("hcSqlAllocStmt     failed");
                     
                        if (hcSqlSetStmtAttr(idOperator, HSCLI_ATTR_FLD_VERBOSE, (void*)1, 0) != 0) // ф-ция hscli.dll "Изменение параметров оператора" получаем расширенную инф.о полях
                            throw std::runtime_error("hcSqlSetStmtAttr     failed");
                     
                        if (hcSqlExecDirect(idOperator, strSqlQuery) != 0)           //ф-ция hscli.dll Выполняем SQLзапрос
                            throw std::runtime_error("hcSqlExecDirect     failed");
                     
                        if (hcSqlNumResultCols(idOperator, &sumColumns) != 0)       //ф-ция hscli.dll Получить кол-во колонок результата
                            throw std::runtime_error("hcSqlNumResultCols   failed");
                     
                        if (hcSqlRowCount(idOperator, &sumRows) != 0)               //ф-ция hscli.dll Получить кол-во строк   результата
                            throw std::runtime_error("hcSqlRowCount        failed");
                     
                        if (hcSqlOpenResults(idOperator, &pRecSize) != 0)         //ф-ция hscli.dll Открытие результатов для чтения
                            throw std::runtime_error("hcSqlOpenResults     failed");
                     
                        std::unique_ptr<hcSqlDstInfoT[]> infoColumns(new hcSqlDstInfoT[sumColumns]); // Структура "Информация о колонках результата"
                     
                        if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns.get(), sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0)
                            throw std::runtime_error("hcSqlGetStmtAttr      failed");                 // Получить информацию об операторе
                     
                    }
                     
                    CStatement::~CStatement()
                    {
                        hcSqlCloseResults(idOperator) ; // ф-ция hscli.dll "Закрытие доступа к результатам"
                        hcSqlFreeStmt(idOperator)     ; // ф-ция hscli.dll "Закрыть оператор"
                    }
                     
                    int      CStatement::GetColumns() // Возвращает кол-во колонок
                    {
                        return sumColumns;
                    }
                     
                    long     CStatement::GetRows() // Возвращает кол-во строк
                    {
                        return  sumRows;
                    }
                     
                    unsigned CStatement::GetRowSize() // Возвращает размер строки в байтах (сумма всех размеров полей)
                    {
                        return pRecSize;
                    }
                     
                    std::vector<char> CStatement::ReadResults(long start, size_t n)
                    {
                        if (!sumRows || !pRecSize || start > sumRows || !n)
                            return std::vector<char>();
                     
                        std::vector<char>  masResult(n * pRecSize);
                     
                        const auto err = hcSqlReadResults(idOperator, start, masResult.data(), masResult.size(), &n);// Чтение результатов
                        if (!err && n != masResult.size())
                            masResult.resize(n);
                     
                        return std::vector<char>(masResult);   //  return masResult;
                    }



                    Цитата kms @
                    нет , перепроверил несколько раз переставлял по разному, всякие варианты перепробовал , заголовки не влияют на это
                    не принимает вот эту конструкцию


                    Во-первых, там не CStatement::CStatement, должно быть? Во-вторых, что там проверять и пробовать? Там либо знаешь как делать, либо не знаешь (твой случай).

                    Цитата kms @
                    не хочет брать и все

                    Что говорит, что не знает что такое CConnection? Это у тебя заголовок не подключен.
                    Либо ты что-то напутал в именах переменных

                    Цитата kms @
                            std::vector<char>  masResult(Query1.GetRows() * Query1.GetRowSize()); // делаем массив для приема результата
                     
                            masResult = Query1.ReadResults(0, Query1.GetRows() );


                    Не надо там делать массив, надо просто сделать
                    auto masResult = Query1.ReadResults(0, Query1.GetRows() );

                    Цитата kms @
                    #include "HSCLI.H"
                    #include "Connection.h"
                    #include "Statement.h"
                    #define SIZE_HCSQLDSTINFOT      128


                    Ещё раз повторяю - это неправильно!
                    Во-первых, получается, что в Connection.h ты делаешь include самого себя, то же самое Statement.h
                    Во-вторых, в класс Connection должен быть определён раньше класса Statement, т.е. Connection.h не должен включать Statement.h. А у тебя получается хрен знает что.
                      Олег М а ты на чем сидишь ?
                        Цитата kms @
                        Олег М а ты на чем сидишь ?

                        Программирую на vs2010 и gcc.
                          Цитата Олег М @
                          Программирую на vs2010 и gcc.

                          странно , тогда у тебя должно работать тот код который ты показываешь, или ты чисто теоретически решаешь ,

                          Цитата Олег М @
                          Во-первых, там не CStatement::CStatement, должно быть?

                          а как же тогда конструктор объявлять

                          Цитата Олег М @
                          Во-вторых, что там проверять и пробовать?

                          так если ты один код предлагаешь а он сразу показывает ошибку не принимает , приходится перебирать варианты ,

                          Цитата Олег М @
                          Там либо знаешь как делать, либо не знаешь (твой случай).

                          попробуй все таки загони свой код в vs2010 и посмотришь что там

                          я делаю два класса в 4-х файлах , стандартная опция при создании класса в MSVS , а все заголовки скидываю в один .h ,
                          потому что так удобней , а насчет того что это нельзя так делать два дня ищу в интернете не могу найти,

                          Цитата Олег М @
                          Что говорит, что не знает что такое CConnection? Это у тебя заголовок не подключен.

                          все подключено и все работает , но при внесении твоей конструкции
                          ExpandedWrap disabled
                            CStatement(CConnection  & idConnect,   const char *strSqlQuery )
                                        : idOperator(0)
                                        , sumColumns(0)
                                        , sumRows(0)
                                        , pRecSize(0)
                                        ;

                          она начинает ругаться , я не знаю почему но MSVS не хочет это брать и все , может тут в синтаксисе ошибка или еще чето , но такую конструкцию я не знаю , хоть на словах объясни что это , но ошибка из-за этого

                          Цитата Олег М @
                          Не надо там делать массив, надо просто сделать
                          auto masResult = Query1.ReadResults(0, Query1.GetRows() );

                          сделал но выводится все равно только первые буквы

                          Цитата Олег М @
                          Ещё раз повторяю - это неправильно!
                          Во-первых, получается, что в Connection.h ты делаешь include самого себя, то же самое Statement.h

                          ну это вообще странно слышать а как же #pragma once

                          Цитата Олег М @
                          Во-вторых, в класс Connection должен быть определён раньше класса Statement, т.е. Connection.h не должен включать Statement.h.

                          это я попробую
                            Цитата kms @
                            все подключено и все работает , но при внесении твоей конструкции

                            CStatement(CConnection  & idConnect,   const char *strSqlQuery )
                                        : idOperator(0)
                                        , sumColumns(0)
                                        , sumRows(0)
                                        , pRecSize(0)
                                        ;

                            Это не "моя конструкция" - это так инициализируются переменные в конструкторе. А что там у тебя точка с запятой в конце делает? Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement.

                            Добавлено
                            Цитата kms @

                            сделал но выводится все равно только первые буквы

                            Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных

                            ExpandedWrap disabled
                              auto masResult = Query1.ReadResults(0, Query1.GetRows());
                              size_t rows = masResult.size() / Query1.GetRowSize();
                              сhar *p = masResult.data();
                                  for (size_t i = 0; i < rows; ++i)//идем по строкам
                                  {
                                      for (size_t j = 0; j < Query1.GetCols(); ++j)// идем по колонкам
                                      {
                                          
                                  switch (Query1.GetColInfo(j)->type)// в зависимости от типа колонки преобразовываем в соответствующий тип
                                          {
                                          case HSCLI_ET_CHAR: // 0 Массив символов длиной не более заданной
                                          {
                                              std::string s(p, infCol[j].len);
                                              std::cout << s.c_str() << "  ";
                                          }
                                          break;
                              ...........................
                              Цитата Олег М @
                              Это не "моя конструкция" - это так инициализируются переменные в конструкторе. А что там у тебя точка с запятой в конце делает? Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement.

                              да точно , точка с запятой этот момент я пропустил, теперь я понял как делать, сейчас делаю

                              Добавлено
                              Цитата Олег М @
                              Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных

                              ОК понял , делаю
                                Цитата Олег М @
                                Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement.

                                а как же по другому в Statement.h прототип конструктора
                                ExpandedWrap disabled
                                  class CStatement
                                  {
                                  public:
                                   
                                      CStatement(CConnection  & idConnect, const char *strSqlQuery) : idOperator(0)
                                          , sumColumns(0)
                                          , sumRows(0)
                                          , pRecSize(0)       ; // Конструктор  
                                  .......

                                точка с запятой просто обязана там быть в опреоре
                                другое дело в Statement.cpp там идет объявление конструктора
                                ExpandedWrap disabled
                                   
                                  CStatement::CStatement(CConnection  & idConnect, const char *strSqlQuery) : idOperator(0)
                                                                                                             , sumColumns(0)
                                                                                                             , sumRows(0)
                                                                                                             , pRecSize(0)
                                                                                                               // Конструктор
                                  {
                                      if (hcSql......................

                                и каждое объявление не заканчивается ;

                                Добавлено
                                поетому как только я добавляю список членов в конструктор таким способом , редактор сразу подкрашивает ; и пишет
                                ExpandedWrap disabled
                                   
                                  Ошибка (активно)требуется фигурная скобка "{"HyTech \Statement.h14


                                Добавлено
                                вот теперь немного почитав Список инициализации членов в конструкторе.
                                в Statement.h убрал а в Statement.cpp оставил
                                и расположив в соответствуещем порядке запускаю , работает вот теперь твая предложенная конструкция работает , привел переменные в соответсствие ,

                                Добавлено
                                Олег М вот только все равно не могу понять зачем так дописывать переменные если они все равно объявленны и к ним доступ есть и оно работает , или я какой то момент не догоняю , объясни пожалуйста

                                Добавлено
                                Цитата Олег М @
                                Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных

                                а можно ли эту обработку данных спрятать в класс ,
                                что бы в main оставить только " Подключился - Запрос - выводРезультата - закрытиеЗапроса - Отключение "
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1052 ]   [ 17 queries used ]   [ Generated: 18.05.24, 16:06 GMT ]