Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.251.37] |
|
Страницы: (19) 1 [2] 3 4 ... 18 19 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Сообщ.
#17
,
|
|
|
да и еще , избавится от конструкции
hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения. hcHDB hdb; // Идентификатор соединения. pdb = &hdb; не получается Добавлено там есть еще функции 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> ОК я еще добавил int pCol=0; // Место для количества колонок hcRECNO pStr=0; // Место для количества строк hcSqlNumResultCols(hOper, &pCol); // Получить количество колонок результата hcSqlRowCount(hOper, &pStr); // Получить количество строк результата |
Сообщ.
#18
,
|
|
|
Цитата kms @ да и еще , избавится от конструкции hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения. hcHDB hdb; // Идентификатор соединения. pdb = &hdb; не получается Почему? Добавлено Ну да, что-то похожее на способ получения информации о столбцах. Чтоб разобрать данные, которые вернулись из hcSqlReadResults |
Сообщ.
#19
,
|
|
|
Цитата Олег М @ да и еще , избавится от конструкции hcHDB *pdb; // Адрес памяти, куда будет записан идентификатор созданного соединения. hcHDB hdb; // Идентификатор соединения. pdb = &hdb; не получается Почему? Слушай , попробовал по третьему разу и получилось, #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"); } и выхлоп Прикреплённая картинка
|
Сообщ.
#20
,
|
|
|
Цитата kms @ printf("%s\n", buf); // выводим на экран Это неправильно, надо делать buf.get(). Там можно было сделать std::cout << buf.get() << std::endl; Ну и ты не ответил вопрос насчёт строки. Попробуй там сделать select *, 123 from TABLES; Добавлено Включи в компиляторе warnings, полный уровень. Там у тебя наверняка сругается на этот printf. |
Сообщ.
#21
,
|
|
|
Цитата Олег М @ Это неправильно, надо делать buf.get(). Там можно было сделать std::cout << buf.get() << std::endl; ОК, переделал , работает Добавлено Цитата Олег М @ Ну и ты не ответил вопрос насчёт строки. Попробуй там сделать select *, 123 from TABLES; Насчет строки я думаю и пробую с самого начала, но в отладчике конкретно не видно , т.е. если в начале когда не чего не получалось , смотрел переменную buf там было 0х000000000 ,а теперь выхожу по точке останова в цикле и выставляю контрольное значение на buf и там показывает - (buf)._Mypair._Myval2 0x00bb2290 "AVER HTADMIN BASE TABLE C:\\HyTech\\DB\\AVER ... char * Добавлено Конструкция select *, 123 from TABLES; для SQL HyTech ошибочна, потому что он не может добавить после вывода всех полей еще поле со значением "123", а вот select 123 from TABLES; дает вывод на консоль { (одна скобка), и вот что в отладчике - (buf)._Mypair._Myval2 0x00735bc0 "{" char * |
Сообщ.
#22
,
|
|
|
Цитата kms @ ,а теперь выхожу по точке останова в цикле и выставляю контрольное значение на buf и там показывает Ты там не выставишь контрольное значение на uniqueptr. Сделай select, который я написал и посмотри, что выведется на экран Добавлено Цитата kms @ а вот select 123 from TABLES; дает вывод на консоль { (одна скобка), и вот что в отладчике Сделай на всякий случай не 123, а чтонибудь другое. Но, похоже там возвращается не строка, а байтовый массив, который надо разбирать по определенным правилам |
Сообщ.
#23
,
|
|
|
Цитата Олег М @ не возможно сделать ошибка HyTEch: -1018 , и прога вываливается Сделай select, который я написал и посмотри, что выведется на экран Добавлено Цитата Олег М @ Сделай на всякий случай не 123, а чтонибудь другое. делаю fix all; select 'www' from TABLES; выхлоп wwwээээ Добавлено делаю делаю fix all; select 'www' from TABLES; выхлоп в консоль wwwQQQээээ т.е. добавляется ээээ в конце строки Добавлено если убираю //setlocale(LC_ALL, "RUS"); // рус локаль то выхлоп www¤¤¤¤ |
Сообщ.
#24
,
|
|
|
Цитата kms @ т.е. добавляется ээээ в конце строки Т.е. это не строка, а байтовый массив. Надо получать тип данных для каждой колонки и обрабатывать соответственно. |
Сообщ.
#25
,
|
|
|
Вот еще один момент , при запросе к TABLES возвращается все поля строкового типа, а вот если делаю запрос к другой таблице , например подобрал всего с двумя полями с одной строкой , делаю
hcSqlExecDirect(pOper, "fix all; select * from AVER;");//Выполнение SQL в указанном операторе выхлоп при включеной setlocale(LC_ALL, "RUS"); ╬fffffц4@¤¤¤¤▌▌я♥1◄▌▌ выхлоп при отключенной setlocale(LC_ALL, "RUS"); ╬fffffц4@¤¤¤¤▌▌ J┤4▌▌ в реальности там лежат цифры 1998 20,9 1998 - в БД представлено именно как int Добавлено Цитата Олег М @ Т.е. это не строка, а байтовый массив. Надо получать тип данных для каждой колонки и обрабатывать соответственно. да так оно и есть , только я не могу пока понять как , я смотрю сейчас на остальные функции //Ф-ция Получить информацию об соединении 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 тут есть такой момент в функции hcERR hcSqlGetStmtAttr( hcHSTMT h, /* Идентификатор оператора */ unsigned option, /* Режим */ int pos, /* Позиция */ void *pValue, /* Буфер для значения */ unsigned size, /* и его размер */ unsigned *cnt); /* сколько байтов записали в буфер */ описание параметра option Идентификатор параметра оператора, который меняем. Параметр 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 — Информация об колонке результата и там его описание вот сейчас я и пробую эту ф-цию Добавлено делаю так unsigned option; // Режим int pos; // Позиция void pValAttr;//Адрес буфера памяти, в которую будут записаны значение (значения) параметра соединения. unsigned sizeAttr;// и его размер unsigned cntAttr;// сколько байтов записали в буфер hcSqlGetConnectAttr(pdb, option, pos, &pValAttr, sizeAttr, &cntAttr ); // Получить информацию об соединении ругается ОшибкаC2182pValAttr: недопустимое использование типа "void"AdmHyTechc:\users\admin\desktop\admhytech\admhytech\main.cpp35 |
Сообщ.
#26
,
|
|
|
Цитата kms @ ОшибкаC2182pValAttr: недопустимое использование типа "void"AdmHyTechc:\users\admin\desktop\admhytech\admhytech\main.cpp35 Я так и не понял ты переменные инициализируешь, присваиваешь им какие-то значения? Думаю там должно быть что-то вроде { 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 } } |
Сообщ.
#27
,
|
|
|
ОК сейчас пробую
Добавлено Попробывал так 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* , как написано в описании к функции и в заголовочном файле HSCLI_FUN(hcERR) hcSqlGetStmtAttr( hcHSTMT h, /* Идентификатор оператора */ unsigned option, /* Режим */ int pos, /* Позиция */ void *pValue, /* Буфер для значения */ unsigned size, /* и его размер */ unsigned *cnt) /* сколько байтов записали в буфер */ HSCLI_EOF Добавлено Вот еще у них на сайте к описанию этой функции есть пример 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); } сейчас его пробую Добавлено не это вообще не о том |
Сообщ.
#28
,
|
|
|
Цитата kms @ Помоему изначально надо void* , как написано в описании к функции и в заголовочном файле К указателю на void преобразовывается любой указатель. Передавать же туда надо указатель на переменную, тип которой зависит от параметра option (там ниже описано, что именно). В параметре size передаётся sizeof() этой переменной (НЕ УКАЗАТЕЛЯ НА НЕЁ!). |
Сообщ.
#29
,
|
|
|
Понял но не совсем , если с начала , надо получить информацию об операторе, делаю так:
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 ); Прикреплённая картинка
Добавлено вот в эту переменную void *pValueOp; // Буфер для значения что записывается ? Добавлено В описании к функции написано const void * (выходной)pValueАдрес буфера памяти, в которую будут записаны значение (значения) параметра оператора. |
Сообщ.
#30
,
|
|
|
Цитата kms @ вот в эту переменную void *pValueOp; // Буфер для значения Я ж те вроде написал как сделать, сделай также. Там должен быть указатель на одну или несколько структур hcSqlDstInfoT Добавлено А как у тебя получилось одинаковое количество колонок и строк, ты там точно ничего не перепутал? |