Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.2.122] |
|
Страницы: (8) « Первая ... 4 5 [6] 7 8 все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Цитата kms @ Олег М вот только все равно не могу понять зачем так дописывать переменные если они все равно объявленны и к ним доступ есть и оно работает , или я какой то момент не догоняю , объясни пожалуйста Чтоб присвоить им значения. Если ты этого не сделаешь, там будет мусор, случайные числа. Цитата kms @ а можно ли эту обработку данных спрятать в класс , что бы в main оставить только " Подключился - Запрос - выводРезультата - закрытиеЗапроса - Отключение " Сделай пока так, дальше посмотрим |
Сообщ.
#77
,
|
|
|
теперь затык на switch ( Query1.GetColumnsInfo(j)->type )// в зависимости от типа колонки преобразовываем в соответствующий тип { // case HSCLI_ET_CHAR: // 0 Массив символов длиной не более заданной // { // std::string s(p, Query1.GetColumnsInfo(j)->len ); // std::cout << s.c_str() << " "; // } // break; } дебаг останавливается на строке Query1.GetColumnsInfo(j)->type GetColumnsInfo(0) - _Myval2 0x00000000 <NULL> hcSqlDstInfoT * aliasno <Чтение памяти невозможно> fieldno <Чтение памяти невозможно> type <Чтение памяти невозможно> len <Чтение памяти невозможно> off <Чтение памяти невозможно> + coder 0x00000014 <Ошибка при чтении символов строки.>char[32] + fname 0x00000034 <Ошибка при чтении символов строки.>char[32] func <Чтение памяти невозможно> + asname 0x00000058 <Ошибка при чтении символов строки.>char[32] key <Чтение памяти невозможно> resno <Чтение памяти невозможно> Добавлено Цитата Олег М @ Чтоб присвоить им значения. Если ты этого не сделаешь, там будет мусор, случайные числа. ОК сделал так Statement.cpp Скрытый текст #define HYCFG_WIN32 #include "HyTech.h" CStatement::CStatement(CConnection & idConnect, const char *strSqlQuery) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) // Конструктор { 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]); // Структура "Информация о колонках результата" hcSqlDstInfoT *infoColumns = new hcSqlDstInfoT[sumColumns]; if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns , sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) throw std::runtime_error("hcSqlGetStmtAttr failed"); // Получить информацию об операторе //std::cout << infoColumns[0].fname << std::endl; } 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) { unsigned cnt; if (!sumRows || !pRecSize || start > sumRows || !n) return std::vector<char>(); std::vector<char> masResult(n *pRecSize); hcSqlReadResults(idOperator, start, masResult.data(), masResult.size(), &n);// Чтение результатов if ( n != masResult.size() ) masResult.resize(n); return masResult; // return std::vector<char>(masResult); // } hcSqlDstInfoT *CStatement::GetColumnsInfo(int idx) { if (idx < sumColumns) return &infoColumns[idx]; else return nullptr; } Добавлено Statement.h Скрытый текст #pragma once #define HYCFG_WIN32 #include "HyTech.h" class CStatement { public: CStatement(CConnection & idConnect, const char *strSqlQuery) ; // Конструктор ~CStatement(); int GetColumns() ; // Возвращает кол-во колонок long GetRows() ; // Возвращает кол-во строк unsigned GetRowSize() ; // Возвращает размер строки в байтах (сумма всех размеров полей) std::vector<char> ReadResults(long start, size_t n) ; // Чтение результата hcSqlDstInfoT *GetColumnsInfo(int idx) ; protected: hcHSTMT idOperator; // Адрес памяти, куда будет записан идентификатор созданного оператора. int sumColumns; // кол-во колонок результата long sumRows; // кол-во строк результата unsigned pRecSize; // Размер читаемой записи в байтах, в ф-ции "Открытие результатов для чтения" . unsigned cntOp; // Размер считанной информации в байтах, в ф-ции "Получить информацию об операторе". Если это кол-во разделить на размер значения, то можно получить кол-во считанных значений(для параметров, которые имеют массив значений). std::unique_ptr<hcSqlDstInfoT[]> infoColumns; // Структура "Информация о колонках результата" //hcSqlDstInfoT *infoColumns ; }; Добавлено main.cpp Скрытый текст #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; auto masResult = Query1.ReadResults(0, Query1.GetRows()); unsigned n = Query1.GetRows() ; size_t rows = Query1.GetRows() ; char *p = masResult.data() ; for (size_t i = 0; i < rows; ++i)//идем по строкам { for (size_t j = 0; j < Query1.GetColumns(); ++j)// идем по колонкам { switch ( Query1.GetColumnsInfo(j)->type )// в зависимости от типа колонки преобразовываем в соответствующий тип { // case HSCLI_ET_CHAR: // 0 Массив символов длиной не более заданной // { // std::string s(p, Query1.GetColumnsInfo(j)->len ); // std::cout << s.c_str() << " "; // } // break; } } } std::system("pause") ; } |
Сообщ.
#78
,
|
|
|
Цитата kms @ дебаг останавливается на строке Query1.GetColumnsInfo(j)->type GetColumnsInfo(0) А GetColumns() какое число возвращает? |
Сообщ.
#79
,
|
|
|
что то я намудрил с
hcSqlDstInfoT *CStatement::GetColumnsInfo(int idx) { if (idx < sumColumns) return &infoColumns[idx]; else return nullptr; } в одну строку как ты написал const hcSqlDstInfoT *CStatement::GetColumnsInfo(int idx) const { return idx < sumColumns ? infoColumns[idx] : nullptr; } не хочет брать кричит на nullptr Ошибка (активно) несовместимые типы операндов ("hcSqlDstInfoT" и "std::nullptr_t")HyTech \Statement.cpp87 ОшибкаC2446:: нет преобразования "nullptr" в "hcSqlDstInfoT"HyTech \statement.cpp87 Добавлено Цитата Олег М @ А GetColumns() какое число возвращает? возвращает 9 Добавлено это соответствует действительности , в этой таблице реально 9 столбиков |
Сообщ.
#80
,
|
|
|
Цитата kms @ return idx < sumColumns ? infoColumns[idx] : nullptr; Сделай return idx < sumColumns ? infoColumns.get() + idx: nullptr; |
Сообщ.
#81
,
|
|
|
может что то не правильно в прототипе std::unique_ptr<hcSqlDstInfoT[]> infoColumns; // Структура ....
class CStatement { public: CStatement(CConnection & idConnect, const char *strSqlQuery) ; // Конструктор ~CStatement(); int GetColumns() ; // Возвращает кол-во колонок long GetRows() ; // Возвращает кол-во строк unsigned GetRowSize() ; // Возвращает размер строки в байтах (сумма всех размеров полей) std::vector<char> ReadResults(long start, size_t n) ; // Чтение результата const hcSqlDstInfoT *GetColumnsInfo(int idx)const; protected: hcHSTMT idOperator; // Адрес памяти, куда будет записан идентификатор созданного оператора. int sumColumns; // кол-во колонок результата long sumRows; // кол-во строк результата unsigned pRecSize; // Размер читаемой записи в байтах, в ф-ции "Открытие результатов для чтения" . unsigned cntOp; // Размер считанной информации в байтах, в ф-ции "Получить информацию об операторе". Если это кол-во разделить на размер значения, то можно получить кол-во считанных значений(для параметров, которые имеют массив значений). std::unique_ptr<hcSqlDstInfoT[]> infoColumns; // Структура "Информация о колонках результата" //hcSqlDstInfoT *infoColumns ; }; а потом объявление в теле идет const hcSqlDstInfoT *CStatement::GetColumnsInfo(int idx)const { if (idx < sumColumns) return &infoColumns[idx]; else return nullptr; } и вот это return &infoColumns[idx]; наверно что то не то я изобразил чувствую |
Сообщ.
#82
,
|
|
|
Покажи код, CStatement
|
Сообщ.
#83
,
|
|
|
Цитата Олег М @ Сделай return idx < sumColumns ? infoColumns.get() + idx: nullptr; ага сделал , это пропустила , но потом все равно во время выполнения вываливается настрочке switch ( Query1.GetColumnsInfo(j)->type )// в зависимости от типа колонки преобра........ Добавлено Цитата Олег М @ Покажи код, CStatement Statement.h #pragma once #define HYCFG_WIN32 #include "HyTech.h" class CStatement { public: CStatement(CConnection & idConnect, const char *strSqlQuery) ; // Конструктор ~CStatement(); int GetColumns() ; // Возвращает кол-во колонок long GetRows() ; // Возвращает кол-во строк unsigned GetRowSize() ; // Возвращает размер строки в байтах (сумма всех размеров полей) std::vector<char> ReadResults(long start, size_t n) ; // Чтение результата const hcSqlDstInfoT *GetColumnsInfo(int idx)const; protected: hcHSTMT idOperator; // Адрес памяти, куда будет записан идентификатор созданного оператора. int sumColumns; // кол-во колонок результата long sumRows; // кол-во строк результата unsigned pRecSize; // Размер читаемой записи в байтах, в ф-ции "Открытие результатов для чтения" . unsigned cntOp; // Размер считанной информации в байтах, в ф-ции "Получить информацию об операторе". Если это кол-во разделить на размер значения, то можно получить кол-во считанных значений(для параметров, которые имеют массив значений). std::unique_ptr<hcSqlDstInfoT[]> infoColumns; // Структура "Информация о колонках результата" //hcSqlDstInfoT *infoColumns ; }; Statement.cpp #define HYCFG_WIN32 #include "HyTech.h" CStatement::CStatement(CConnection & idConnect, const char *strSqlQuery) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) // Конструктор { 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]); // Структура "Информация о колонках результата" hcSqlDstInfoT *infoColumns = new hcSqlDstInfoT[sumColumns]; if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns , sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) throw std::runtime_error("hcSqlGetStmtAttr failed"); // Получить информацию об операторе //std::cout << infoColumns[0].fname << std::endl; } 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) { unsigned cnt; if (!sumRows || !pRecSize || start > sumRows || !n) return std::vector<char>(); std::vector<char> masResult(n *pRecSize); hcSqlReadResults(idOperator, start, masResult.data(), masResult.size(), &n);// Чтение результатов if ( n != masResult.size() ) masResult.resize(n); return masResult; // return std::vector<char>(masResult); // } const hcSqlDstInfoT *CStatement::GetColumnsInfo(int idx) const { return idx < sumColumns ? infoColumns.get() + idx : nullptr; } |
Сообщ.
#84
,
|
|
|
Цитата kms @ //std::unique_ptr<hcSqlDstInfoT[]> infoColumns(new hcSqlDstInfoT[sumColumns]); // Структура "Информация о колонках результата" hcSqlDstInfoT *infoColumns = new hcSqlDstInfoT[sumColumns]; Ещё бы у тебя там что-то возвращалось. Ты сохраняешь всё в локальную переменную. Как ты думаешь, зачем у меня переменные класса начинаются с m_? Чтоб не путать с локальными. Сделай infoColumn.reset(new hcSqlDstInfoT[sumColumns]); // Структура "Информация о колонках результата" Это убери - hcSqlDstInfoT *infoColumns = new hcSq......................................... Добавлено Цитата kms @ if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns , sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) Сделай if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns.get(), sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) |
Сообщ.
#85
,
|
|
|
Цитата Олег М @ Как ты думаешь, зачем у меня переменные класса начинаются с m_? Чтоб не путать с локальными. теперь понятно , а вот это Цитата Олег М @ Сделай infoColumn.reset(new hcSqlDstInfoT[sumColumns]); // Структура "Информация о колонках результата" Это убери - hcSqlDstInfoT *infoColumns = new hcSq......................................... Добавлено 9 минут назад Цитата kms @ 38 минут назад if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns , sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) Сделай if (hcSqlGetStmtAttr(idOperator, HSCLI_STMT_DST_INFO, 0, infoColumns.get(), sumColumns * SIZE_HCSQLDSTINFOT, &cntOp) != 0) сделал она вертится Прикреплённая картинка
Добавлено добавил switch ( Query1.GetColumnsInfo(j)->type ){} p += Query1.GetColumnsInfo(j)->len; |
Сообщ.
#86
,
|
|
|
Сообщ.
#87
,
|
|
|
Сообщ.
#88
,
|
|
|
ну вот как то так , неправельно преобразовывает второй столбец у него тип ДАТА
void main() { //setlocale(LC_ALL, ""); CConnection Conect1 ; Conect1.Connect("tcpip:/localhost:13000" , "HTADMIN" , "PASSWORD"); CStatement Query1(Conect1, "fix all; select * from TAB4;") ; auto masResult = Query1.ReadResults(0, Query1.GetRows()); unsigned n = Query1.GetRows() ; size_t rows = Query1.GetRows() ; char *p = masResult.data() ; for (size_t i = 0; i < rows; ++i)//идем по строкам { for (size_t j = 0; j < Query1.GetColumns(); ++j)// идем по колонкам { switch ( Query1.GetColumnsInfo(j)->type )// в зависимости от типа колонки преобразовываем в соответствующий тип { case HSCLI_ET_CHAR: // 0 Массив символов длиной не более заданной { std::string s(p, Query1.GetColumnsInfo(j)->len ); std::cout << s.c_str() << " "; } break; case HSCLI_ET_ARRA: // 1 Массив байтов заданной длины std::cout << *reinterpret_cast<unsigned char *>(p) << " "; break; case HSCLI_ET_BYTE: // 2 Элемент - unsigned char (короткое целое) short std::cout << *reinterpret_cast<unsigned char *>(p) << " " ; break; case HSCLI_ET_INTR: // 3 Элемент - signed short std::cout << *reinterpret_cast<signed short *>(p) << " " ; break; case HSCLI_ET_WORD: // 4 Элемент - unsigned short std::cout << *reinterpret_cast<unsigned short *>(p) << " " ; break; case HSCLI_ET_DATE: // 5 Дата - unsigned short std::cout << *reinterpret_cast<unsigned short *>(p) << " " ; break; case HSCLI_ET_NMBR: {//6 Номер - 3-х байтовое целое без знака // std::cout << *reinterpret_cast< *>(p); //dR[j] = ; } break; case HSCLI_ET_LONG: //7 Элемент - long int std::cout << *reinterpret_cast<long int *>(p) << " "; break; case HSCLI_ET_DWRD: // 8 Элемент - unsigned long int в БД это dword std::cout << *reinterpret_cast<unsigned long int *>(p) << " "; break; case HSCLI_ET_FLOA: // 9 Элемент - float //textBox1->AppendText(" " + *reinterpret_cast<float *>(p) + " "); std::cout << *reinterpret_cast<float *>(p) << " "; break; case HSCLI_ET_CURR: // 10 Деньги (double) std::cout << *reinterpret_cast<double *>(p) << " "; break; case HSCLI_ET_DFLT: // 11 Элемент - double std::cout << *reinterpret_cast<double *>(p) << " "; break; case HSCLI_ET_QINT: // 12 Элемент - signed __int64 std::cout << *reinterpret_cast<signed __int64 *>(p) << " "; break; case HSCLI_ET_QWRD: // 13 Элемент - unsigned __int64 std::cout << *reinterpret_cast<unsigned __int64 *>(p) << " "; break; } p += Query1.GetColumnsInfo(j)->len;// сдвигаем указатель на длину поля, чтобы указывал на начало следующего поля } std::cout << std::endl; } std::system("pause") ; } Прикреплённая картинка
|
Сообщ.
#89
,
|
|
|
Цитата kms @ case HSCLI_ET_ARRA: // 1 Массив байтов заданной длины std::cout << *reinterpret_cast<unsigned char *>(p) << " "; break; Это неправильно, это байтовый массив его нельзя так распечатывать Добавлено Цитата kms @ ну вот как то так , неправельно преобразовывает второй столбец у него тип ДАТА Там у них есть какие-то функции для преобразования HSCLI_ET_DATE Добавлено hcSqlUnpackDate |
Сообщ.
#90
,
|
|
|
работает конечно очень медленно порядка 5сек
Добавлено Цитата Олег М @ Это неправильно, это байтовый массив его нельзя так распечатывать да я понял еще в самом начале , просто не знаю как правельно и хотел это на последок оставить Цитата Олег М @ Там у них есть какие-то функции для преобразования HSCLI_ET_DATE Добавлено 1 минуту назад hcSqlUnpackDate во точно сейчас буду смотреть делать Добавлено ну вот как то так на быструю руку ........ case HSCLI_ET_DATE: { // 5 Дата - unsigned short unsigned day=0, month = 0, year = 0; hcSqlUnpackDate(*reinterpret_cast<unsigned short *>(p), &day, &month, &year); std::cout << day << "-" << month << "-" << year << " "; } break; ........... работает теперь бы остальные типы данных по правельному распознать |