На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (19) 1 [2] 3 4 ...  18 19 все  ( Перейти к последнему сообщению )  
> Функция из DLL , Вывод данных
    Цитата kms @
    Ошибка namespace "std" не содержит члена "unique_ptr"

    Сделай #include <memory>

    Добавлено
    Цитата kms @
    cout << buf; // выводим на экран


    А ты уверен, что там возвращается именно строка, с нулем на конце, а не бинарные данные?
      да и еще , избавится от конструкции
      ExpandedWrap disabled
                hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения.
            hcHDB  hdb; // Идентификатор   соединения.
            pdb = &hdb;

      не получается

      Добавлено
      Цитата Олег М @
      Кроме того я там так и не понял как разобрать запись по полям.

      там есть еще функции
      ExpandedWrap disabled
          hcERR hcSqlNumResultCols(
          hcHSTMT   h,      /* Номер оператора */
          int       *pCol);     /* Место для количества колонок */
          
          hcERR hcSqlRowCount(
          hcHSTMT   h,      /* Номер оператора */
          hcRECNO   *pCnt);     /* Место для количества строк */


      и самое главное вот это http://hytechdb.ru/index.php?s=docs&ru=V25...GetStmtAttr.htm

      Добавлено
      Цитата Олег М @
      Сделай #include <memory>

      ОК
      я еще добавил
      ExpandedWrap disabled
        int      pCol=0; //  Место для количества колонок
            hcRECNO  pStr=0; //  Место для количества строк  
             hcSqlNumResultCols(hOper,  &pCol); // Получить количество колонок результата
             hcSqlRowCount(hOper,  &pStr);      // Получить количество строк результата
      Сообщение отредактировано: kms -
        Цитата kms @
        да и еще , избавится от конструкции

                hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения.
            hcHDB  hdb; // Идентификатор   соединения.
            pdb = &hdb;

        не получается


        Почему?

        Добавлено
        Цитата kms @
        и самое главное вот это http://hytechdb.ru/index.php?s=docs&ru=V25...GetStmtAttr.htm


        Ну да, что-то похожее на способ получения информации о столбцах. Чтоб разобрать данные, которые вернулись из hcSqlReadResults
          Цитата Олег М @
          да и еще , избавится от конструкции

                  hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения.
              hcHDB  hdb; // Идентификатор   соединения.
              pdb = &hdb;

          не получается


          Почему?


          Слушай , попробовал по третьему разу и получилось,
          ExpandedWrap disabled
            #define HYCFG_WIN32
            #include "hscli.h"
            #include <iostream>
            #include <memory>
             
            using namespace std;
             
            int main() {
                
                setlocale(LC_ALL, "RUS"); // устанавливаем рус локаль
                
                hcSqlParmT  *pInit; // Адрес структуры с параметрами инициализации типа hcSqlParmT.
                
                hcERR err;
                hcSqlParmT Init = { sizeof(Init) };
                if ((err = hcSqlInit(&Init)) != 0)     // Инициализация клиентской части
                {  
                    printf( "Ошибка с параметрами инициализации \n");
                    return 0;
                }
                
                if (hcSqlCheckInit() < 0 )  // Проверка завершения инициализации
                {
                    printf( "Ошибка завершения инициализации \n" );
                    return 0;
                }
                    
                hcHDB  pdb; // Адрес памяти, куда будет записан идентификатор   соединения.
                
                hcSqlAllocConnect( &pdb); // Создать соединение
                hcSqlConnect(  pdb, "tcpip:/localhost:13000", "HTADMIN", "PASSWORD");//Установить связь с СУБД
             
                hcHSTMT      pOper;// Адрес памяти, куда будет записан идентификатор   оператора.
                
                hcSqlAllocStmt(pdb, &pOper);    // Создать оператор
                hcSqlExecDirect(pOper, "fix all; select * from TABLES;");//Выполнение SQL в указанном операторе
                
                int      pCol=0; //  Место для количества колонок
                hcRECNO  pStr=0; //  Место для количества строк  
                hcSqlNumResultCols(pOper,  &pCol); // Получить количество колонок результата
                hcSqlRowCount(pOper,  &pStr);      // Получить количество строк результата
                
                unsigned pRecSize = 0 ;// Адрес слова, в которое запишется размер читаемой записи в байтах.
                  
                hcSqlOpenResults(pOper, &pRecSize);// Открытие результатов для чтения
                if (!pRecSize)
                     return 0;
              
             // - - - - - - - - - - - - - - -  ---------------------------  Чтение результатов --------------------
              
               std::unique_ptr<char[]> buf(new char[pRecSize]);
               unsigned cnt = 0;
               long     gStart = 0 ;         // С какой записи начинаем читать
               void     *pBuf ;             // Адрес буфера для присылаемых записей
              
               for (long rec = 0; rec <  pStr ; rec++)
               {
                   hcSqlReadResults(pOper, rec, buf.get(), pRecSize, &cnt); // Чтение результатов
                   printf("%s\n",  buf); // выводим на экран
               }
            //-------------------------------------------------------------------------------------------------------
              hcSqlCloseResults(pOper); // Закрытие доступа к результатам
              hcSqlFreeConnect(pdb)   ; // Освободить соединение
              hcSqlDone()             ; // Завершение работы
             
             system("pause");
            }


          и выхлоп
          Прикреплённая картинка
          Прикреплённая картинка
            Цитата kms @
            printf("%s\n",  buf); // выводим на экран

            Это неправильно, надо делать buf.get(). Там можно было сделать std::cout << buf.get() << std::endl;
            Ну и ты не ответил вопрос насчёт строки.
            Попробуй там сделать select *, 123 from TABLES;

            Добавлено
            Включи в компиляторе warnings, полный уровень. Там у тебя наверняка сругается на этот printf.
              Цитата Олег М @
              Это неправильно, надо делать buf.get(). Там можно было сделать std::cout << buf.get() << std::endl;

              ОК, переделал , работает

              Добавлено
              Цитата Олег М @
              Ну и ты не ответил вопрос насчёт строки.
              Попробуй там сделать select *, 123 from TABLES;

              Насчет строки я думаю и пробую с самого начала, но в отладчике конкретно не видно , т.е. если в начале когда не чего не получалось , смотрел переменную buf там было 0х000000000 ,а теперь выхожу по точке останова в цикле и выставляю контрольное значение на buf и там показывает
              ExpandedWrap disabled
                -       (buf)._Mypair._Myval2   0x00bb2290 "AVER                            HTADMIN                                                         BASE TABLE                      C:\\HyTech\\DB\\AVER                                                       ...  char *


              Добавлено
              Конструкция select *, 123 from TABLES; для SQL HyTech ошибочна, потому что он не может добавить после вывода всех полей еще поле со значением "123", а вот select 123 from TABLES; дает вывод на консоль { (одна скобка), и вот что в отладчике
              ExpandedWrap disabled
                -       (buf)._Mypair._Myval2   0x00735bc0 "{"  char *
              Сообщение отредактировано: kms -
                Цитата kms @
                ,а теперь выхожу по точке останова в цикле и выставляю контрольное значение на buf и там показывает

                Ты там не выставишь контрольное значение на uniqueptr. Сделай select, который я написал и посмотри, что выведется на экран

                Добавлено
                Цитата kms @
                а вот select 123 from TABLES; дает вывод на консоль { (одна скобка), и вот что в отладчике

                Сделай на всякий случай не 123, а чтонибудь другое. Но, похоже там возвращается не строка, а байтовый массив, который надо разбирать по определенным правилам
                  Цитата Олег М @
                  Сделай select, который я написал и посмотри, что выведется на экран
                  не возможно сделать ошибка HyTEch: -1018 , и прога вываливается

                  Добавлено
                  Цитата Олег М @
                  Сделай на всякий случай не 123, а чтонибудь другое.

                  делаю fix all; select 'www' from TABLES;
                  выхлоп
                  ExpandedWrap disabled
                    wwwээээ


                  Добавлено
                  делаю делаю fix all; select 'www' from TABLES;
                  выхлоп в консоль
                  ExpandedWrap disabled
                     wwwQQQээээ

                  т.е. добавляется ээээ в конце строки

                  Добавлено
                  если убираю
                  ExpandedWrap disabled
                    //setlocale(LC_ALL, "RUS"); //  рус локаль

                  то выхлоп
                  ExpandedWrap disabled
                    www¤¤¤¤
                    Цитата kms @
                    т.е. добавляется ээээ в конце строки

                    Т.е. это не строка, а байтовый массив. Надо получать тип данных для каждой колонки и обрабатывать соответственно.
                      Вот еще один момент , при запросе к TABLES возвращается все поля строкового типа, а вот если делаю запрос к другой таблице , например подобрал всего с двумя полями с одной строкой , делаю
                      ExpandedWrap disabled
                        hcSqlExecDirect(pOper, "fix all; select * from AVER;");//Выполнение SQL в указанном операторе

                      выхлоп при включеной setlocale(LC_ALL, "RUS");
                      ExpandedWrap disabled
                        ╬fffffц4@¤¤¤¤▌▌я♥1◄▌▌


                      выхлоп при отключенной setlocale(LC_ALL, "RUS");
                      ExpandedWrap disabled
                        ╬fffffц4@¤¤¤¤▌▌ J┤4▌▌


                      в реальности там лежат цифры
                      ExpandedWrap disabled
                         1998   20,9

                      1998 - в БД представлено именно как int

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

                      да так оно и есть , только я не могу пока понять как , я смотрю сейчас на остальные функции
                      ExpandedWrap disabled
                        //Ф-ция Получить информацию об соединении
                        hcERR hcSqlGetConnectAttr(
                          hcHDB     h,      /* Идентификатор соединения */
                          unsigned  option,     /* Режим */
                          int       pos,        /* Позиция */
                          void      *pValue,    /* Буфер для значения */
                          unsigned  size,       /* и его размер */
                          unsigned  *cnt);      /* сколько байтов записали в буфер */


                      Добавлено
                      Вот нашел, копипастить сюда не буду просто ссылка http://hytechdb.ru/index.php?s=docs&ru=V25...GetStmtAttr.htm
                      тут есть такой момент в функции
                      ExpandedWrap disabled
                        hcERR hcSqlGetStmtAttr(
                          hcHSTMT   h,      /* Идентификатор оператора */
                          unsigned  option,     /* Режим */
                          int       pos,        /* Позиция */
                          void      *pValue,    /* Буфер для значения */
                          unsigned  size,       /* и его размер */
                          unsigned  *cnt);      /* сколько байтов записали в буфер */

                      описание параметра option
                      ExpandedWrap disabled
                        Идентификатор параметра оператора, который меняем. Параметр option может принимать следующие значения:
                        HSCLI_STMT_SAB_TYPE — Тип результата
                        HSSQL_STMT_SAB_HNDCNT — Количество hytech-обработчиков
                        HSSQL_STMT_SAB_HANDLES — hytech-обработчики
                        HSCLI_STMT_ALS_CNT — Количество алиасов
                        HSCLI_STMT_ALS_INFO — информация об алиасах
                        HSCLI_STMT_DST_INFO — Информация об колонке результата
                        HSCLI_STMT_RC_TYPE — Тип возвращаемого значения
                        HSCLI_STMT_RC_SIZE — Длина возвращаемого значения в байтах
                        HSCLI_STMT_RC_BODY — Возвращаемое значение


                      так вот в частности значение HSCLI_STMT_DST_INFO — Информация об колонке результата
                      и там его описание
                      вот сейчас я и пробую эту ф-цию

                      Добавлено
                      делаю так
                      ExpandedWrap disabled
                        unsigned option; // Режим
                        int  pos;    // Позиция
                        void     pValAttr;//Адрес буфера памяти, в которую будут записаны значение (значения) параметра соединения.
                        unsigned sizeAttr;// и его размер  
                        unsigned cntAttr;// сколько байтов записали в буфер  
                         
                        hcSqlGetConnectAttr(pdb, option, pos, &pValAttr, sizeAttr, &cntAttr );  // Получить информацию об соединении

                      ругается
                      ExpandedWrap disabled
                        ОшибкаC2182pValAttr: недопустимое использование типа "void"AdmHyTechc:\users\admin\desktop\admhytech\admhytech\main.cpp35
                      Сообщение отредактировано: kms -
                        Цитата kms @
                        ОшибкаC2182pValAttr: недопустимое использование типа "void"AdmHyTechc:\users\admin\desktop\admhytech\admhytech\main.cpp35

                        Я так и не понял ты переменные инициализируешь, присваиваешь им какие-то значения?

                        Думаю там должно быть что-то вроде
                        ExpandedWrap disabled
                              {
                                  hcErr err = 0;
                                  int nCols = 0;
                                  err = hcSqlNumResultCols(pdb, &nCols);
                                  if (!err && nCols)
                                  {
                                      cSqlDstInfoT cols[nCols] = {0};
                                      //Либо, если так не скомпилится std::unique_ptr<cSqlDstInfoT> spCols(new cSqlDstInfoT[nCols]);
                                  
                                      
                                      unsigned n = 0;
                                      err = hcSqlGetStmtAttr(pdb, HSCLI_STMT_DST_INFO, 0, cols /*spCols.get()*/, nCols * sizeof(cSqlDstInfoT), n);
                                      if (err)
                                      {
                                          std::err << "error" << std::endl;
                                          return;
                                      }
                                      
                                      for (int i = 0; i < n / sizeof(cSqlDstInfoT); ++i)
                                      {
                                          const auto &col = cols[i];
                                          //Здесь разобрать буфер в зависимости от содержимого col
                                      }
                                  }
                        Сообщение отредактировано: Олег М -
                          ОК сейчас пробую

                          Добавлено
                          Попробывал так
                          ExpandedWrap disabled
                                static int xK = pCol;
                                if (pCol)
                                {
                                    unique_ptr<hcSqlDstInfoT> spCols(new hcSqlDstInfoT[pCol]);
                             
                                    hcSqlGetStmtAttr(pdb, HSCLI_STMT_DST_INFO, 0, spCols.get(), pCol * sizeof(hcSqlDstInfoT), &cntOp);// Получить информацию об операторе
                             
                                    for (int i = 0; i < cntOp / sizeof(hcSqlDstInfoT); ++i)
                                    {
                                        cout << spCols.get();
                                        //Здесь разобрать буфер  
                                    }
                                }


                          Добавлено
                          Помоему изначально надо void* , как написано в описании к функции и в заголовочном файле
                          ExpandedWrap disabled
                            HSCLI_FUN(hcERR) hcSqlGetStmtAttr(
                              hcHSTMT   h,      /* Идентификатор оператора */
                              unsigned  option,     /* Режим */
                              int       pos,        /* Позиция */
                              void      *pValue,    /* Буфер для значения */
                              unsigned  size,       /* и его размер */
                              unsigned  *cnt)       /* сколько байтов записали в буфер */
                                HSCLI_EOF


                          Добавлено
                          Вот еще у них на сайте к описанию этой функции есть пример
                          ExpandedWrap disabled
                            int cnt = 0;
                            /* получим количество обработчиков */
                            if(hcSqlGetStmtAttr(pdb, HSSQL_STMT_SAB_HNDCNT, 0, &cnt, sizeof(cnt), 0) != 0)
                                return; /* здесь надо обработать ошибку */
                            for(i = 0; i < cnt; i++)
                            {   int h;
                                /* получаем очередной обработчик */
                                if(hcSqlGetStmtAttr(pdb, HSSQL_STMT_SAB_HANDLES, i, &h, sizeof(h), 0) != 0)
                                    return; /* здесь надо обработать ошибку */
                                printf("%ld ", h);
                            }

                          сейчас его пробую

                          Добавлено
                          не это вообще не о том
                            Цитата kms @
                            Помоему изначально надо void* , как написано в описании к функции и в заголовочном файле

                            К указателю на void преобразовывается любой указатель. Передавать же туда надо указатель на переменную, тип которой зависит от параметра option (там ниже описано, что именно). В параметре size передаётся sizeof() этой переменной (НЕ УКАЗАТЕЛЯ НА НЕЁ!).
                            Сообщение отредактировано: Олег М -
                              Понял но не совсем , если с начала , надо получить информацию об операторе, делаю так:
                              ExpandedWrap disabled
                                unsigned optionOp = 107;// Режим
                                     int         posOp = 1 ; // Позиция
                                     void  *pValueOp;        // Буфер для значения
                                     unsigned sizeOp = 1024; // и его размер
                                     unsigned  cntOp=0 ;     // сколько байтов записали в буфер
                                    
                                    hcSqlGetStmtAttr(pdb, HSCLI_STMT_DST_INFO, posOp, &pValueOp, sizeof(pValueOp), &cntOp); // Получить информацию об операторе
                                            
                                     printf("%ld ", pValueOp );

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


                              Добавлено
                              вот в эту переменную
                              ExpandedWrap disabled
                                void  *pValueOp;        // Буфер для значения

                              что записывается ?

                              Добавлено
                              В описании к функции написано
                              ExpandedWrap disabled
                                const void * (выходной)pValueАдрес буфера памяти, в которую будут записаны значение (значения) параметра оператора.
                                Цитата kms @
                                вот в эту переменную

                                void  *pValueOp;        // Буфер для значения

                                Я ж те вроде написал как сделать, сделай также. Там должен быть указатель на одну или несколько структур hcSqlDstInfoT

                                Добавлено
                                А как у тебя получилось одинаковое количество колонок и строк, ты там точно ничего не перепутал?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (19) 1 [2] 3 4 ...  18 19 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1277 ]   [ 21 queries used ]   [ Generated: 24.04.24, 01:51 GMT ]