Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.174.57] |
|
Страницы: (8) « Первая ... 3 4 [5] 6 7 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
Не указал имя класса, для всех методов, CStatement:: .................
|
Сообщ.
#62
,
|
|
|
вот еще не могу пройти
СерьезностьКодОписаниеПроектФайлСтрокаСостояние подавления Ошибка (активно)namespace "std" не содержит члена "vector"HyTech \Statement.h34 Добавлено Цитата Олег М @ Не указал имя класса, для всех методов, CStatement:: ................. да это я уже догнал |
Сообщ.
#63
,
|
|
|
Цитата kms @ вот еще не могу пройти Сделай #include <vector> |
Сообщ.
#64
,
|
|
|
все равно ругается на файл
Statement.h class CStatement { public: CStatement(CConnection & idConnect, const char *strSqlQuery ) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) ; вот такие ошибки ОшибкаC2969синтаксическая ошибка: ;: требуется определение функции-члена до "}"HyTech \statement.h23 Ошибка (активно)требуется фигурная скобка "{"HyTech \Statement.h23 ОшибкаC2061синтаксическая ошибка: идентификатор "CConnection"HyTech \statement.h18 |
Сообщ.
#65
,
|
|
|
Покажи файлы
|
Сообщ.
#66
,
|
|
|
убрал в файле Statement.h
: idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) а в файле Statement.cpp оставил теперь 3 ошибки СерьезностьКодОписаниеПроектФайлСтрокаСостояние подавления ОшибкаC2061синтаксическая ошибка: идентификатор "CConnection"HyTech \statement.h18 ОшибкаC2065sumColumns: необъявленный идентификаторHyTech \statement.cpp76 ОшибкаC2065infoColumns: необъявленный идентификаторHyTech \statement.cpp76 Добавлено ругается вот на это const hcSqlDstInfoT CStatement::*GetColInfo(int idx) { return idx < sumColumns ? infoColumns[idx] : nullptr; } |
Сообщ.
#67
,
|
|
|
Сделай уже заголовки, как я говорил. Проблема в этом
|
Сообщ.
#68
,
|
|
|
Цитата Олег М @ Сделай уже заголовки, как я говорил. Проблема в этом нет , перепроверил несколько раз переставлял по разному, всякие варианты перепробовал , заголовки не влияют на это не принимает вот эту конструкцию CStatement(CConnection & idConnect, const char *strSqlQuery ) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) ; не хочет брать и все вообщем я покамест убрал это и сделал вот так 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; 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 #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 #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 #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 #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 #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; } |
Сообщ.
#69
,
|
|
|
Цитата 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. А у тебя получается хрен знает что. |
Сообщ.
#70
,
|
|
|
Олег М а ты на чем сидишь ?
|
Сообщ.
#71
,
|
|
|
Цитата kms @ Олег М а ты на чем сидишь ? Программирую на vs2010 и gcc. |
Сообщ.
#72
,
|
|
|
Цитата Олег М @ Программирую на vs2010 и gcc. странно , тогда у тебя должно работать тот код который ты показываешь, или ты чисто теоретически решаешь , Цитата Олег М @ Во-первых, там не CStatement::CStatement, должно быть? а как же тогда конструктор объявлять Цитата Олег М @ Во-вторых, что там проверять и пробовать? так если ты один код предлагаешь а он сразу показывает ошибку не принимает , приходится перебирать варианты , Цитата Олег М @ Там либо знаешь как делать, либо не знаешь (твой случай). попробуй все таки загони свой код в vs2010 и посмотришь что там я делаю два класса в 4-х файлах , стандартная опция при создании класса в MSVS , а все заголовки скидываю в один .h , потому что так удобней , а насчет того что это нельзя так делать два дня ищу в интернете не могу найти, Цитата Олег М @ Что говорит, что не знает что такое CConnection? Это у тебя заголовок не подключен. все подключено и все работает , но при внесении твоей конструкции 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. это я попробую |
Сообщ.
#73
,
|
|
|
Цитата kms @ все подключено и все работает , но при внесении твоей конструкции CStatement(CConnection & idConnect, const char *strSqlQuery ) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) ; Это не "моя конструкция" - это так инициализируются переменные в конструкторе. А что там у тебя точка с запятой в конце делает? Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement. Добавлено Цитата kms @ сделал но выводится все равно только первые буквы Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных 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; ........................... |
Сообщ.
#74
,
|
|
|
Цитата Олег М @ Это не "моя конструкция" - это так инициализируются переменные в конструкторе. А что там у тебя точка с запятой в конце делает? Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement. да точно , точка с запятой этот момент я пропустил, теперь я понял как делать, сейчас делаю Добавлено Цитата Олег М @ Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных ОК понял , делаю |
Сообщ.
#75
,
|
|
|
Цитата Олег М @ Судя по-всему ты оставил это в h-файле, а надо было перенести в cpp, в конструктор CStatemen::CStatement. а как же по другому в Statement.h прототип конструктора class CStatement { public: CStatement(CConnection & idConnect, const char *strSqlQuery) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) ; // Конструктор ....... точка с запятой просто обязана там быть в опреоре другое дело в Statement.cpp там идет объявление конструктора CStatement::CStatement(CConnection & idConnect, const char *strSqlQuery) : idOperator(0) , sumColumns(0) , sumRows(0) , pRecSize(0) // Конструктор { if (hcSql...................... и каждое объявление не заканчивается ; Добавлено поетому как только я добавляю список членов в конструктор таким способом , редактор сразу подкрашивает ; и пишет Ошибка (активно)требуется фигурная скобка "{"HyTech \Statement.h14 Добавлено вот теперь немного почитав Список инициализации членов в конструкторе. в Statement.h убрал а в Statement.cpp оставил и расположив в соответствуещем порядке запускаю , работает вот теперь твая предложенная конструкция работает , привел переменные в соответсствие , Добавлено Олег М вот только все равно не могу понять зачем так дописывать переменные если они все равно объявленны и к ним доступ есть и оно работает , или я какой то момент не догоняю , объясни пожалуйста Добавлено Цитата Олег М @ Ну ещё бы, это ж массив символов. Здесь у тебя должен быть цикл по обработке данных а можно ли эту обработку данных спрятать в класс , что бы в main оставить только " Подключился - Запрос - выводРезультата - закрытиеЗапроса - Отключение " |