![]() |
|
![]() ![]() ![]() |
|
eugeniy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
// reader_writer.h обьявление /////////////////////////////////////////////////////////////////////////// #if _MSC_VER > 1000 #pragma once #include <winsock.h> #include "mysql.h" #include "mwrf32.h" class CReader { public: CReader(void); ~CReader(void); //////////////////////////////////////////////////////////////////////// // Данные класса MYSQL* conn; MYSQL_RES *res; MYSQL_ROW row; MYSQL_ROW fakultet_name; MYSQL_ROW kurs_name; int ver,t; int st,k,j,s; char *kurs, *fakultet; char *query; char *birth; char a[3]; int rowSize; unsigned char *stud_id; unsigned char i; unsigned char size; unsigned char data[50]; unsigned long sn_card; unsigned long old_sn_card; unsigned char key[6]; HANDLE dev; FILE *file; FILE *fp; /////////////////////////////////////////////////////////////////// // Методы класса // -- инициализация базы данных BOOL Reader_Init(); // -- проверка серийного номера BOOL Read_serial_number(); // -- считывание карты BOOL Card_read(); // -- закрытие устройства BOOL Close_device(); // -- закрытие БД и файлов BOOL Close_mysql_and_file(); // -- получение данных ;) void GetData(char ** & pFakultet,char * & pBirth,char ** & pKurs,char ** & pRow, int & sizeRow); }; #endif // _MSC_VER > 1000 |
||||
|
|||||
eugeniy |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
|
||||||||||||
|
|||||||||||||
Albor |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Можно функцию получения данных оформить так:
К сожалению, я не работал с MYSQL и мне тяжело ориентироваиться в её типах, но, проанализировав приведенный код и бегло просмотрев инфу по MYSQL думаю, что можно сделать так как показано выше. При отображении в классе диалога использовать индекс колонки таблицы б.д.
|
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
eugeniy, на будущее: если функция требует параметр типа char *, то будет неправильным объявить переменную как CDialog* pBirth и пытаться передать её в функцию. Переменная должна соответствовать требуемому типу: char * pBirth; "Скормить" - это означает передать
![]() PS Не обратил внимания сразу: в OnInitDialog ты сделал объявление функции GetData, а не её вызов. Ты ведь создал объект CReader, так и вызывай для него m_reader->GetData(параметры...). Это сообщение отредактировал(а) Albor - 20.4.2010, 17:16 |
|||
|
||||
eugeniy |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Понятно щас поробую, а такой вариант разве не прокатит? 1)в reader_writer.h объявить метод класса CReader вот так
2)потом сделать само тело функции в reader_writer.cpp
3)затем в readerDlg.cpp
строчка m_birthday_CTRL.SetWindowText(m_reader->birth); означает, что мы выводим в контрол m_birthday_CTRL, содержимое переменной birth, ведь объект m_reader класса CReader и сама birth описана как данные класса CReader, т.е. вроде как правильно ссылаемся, но ничерта не работает... Я вот всё смотрю и вижу, что код по работе с девайсом как-то не работает, т.е. рядом файл открыт изначальный на С, где всё работает и выводится, а вот когда в виде проекта оформил уже ничерта не работает....мистика прям. |
||||||||
|
|||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Да должен прокатить раз все переменные в открытом доступе, только GetData в таком варианте не нужна - вместо неё вызвать Card_read() и всё. А что в отладчике вот в этом месте:
Конкретно - что по адресу m_reader->birth? Добавлено через 11 минут и 24 секунды Знаешь что ещё попробуй, перенеси код из OnInitDialog куда-нибудь в другое место, например, добавь кнопку на форму, добавь обработчик нажатия и вставь код туда. Кто знает что ты намудрил с переменными для контрола, может при инициализации текст просто затирается. |
|||
|
||||
eugeniy |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Там вообщем пусто было, т.е. просто в поле ничего не записывалось....в дебаге посмотрел где валится, нашёл ошибку, исправил После этого, всё успешно вывилось содержимое birth в контрол, только вот срабатывает как-то криво, когда карточка лежит на ридере то выводит день рождение, а когда запустил диалог и потом поднёс карточку уже ничерта не выводит, ну это наверно уже приблуды visual c++. хотя когда изначальный код был, то он выводил независимо есть карточка в данный момент на ридере или же потом поднесли, , надо будет с этим позже разобраться.... Только вот переменные объвленные как массив строк не выводятся row[4], row[5] и т.д....в дебаге посмотрел, на строке
пишет: Unhandled exception at 0x0040309f in reader.exe: 0xC0000005: Access violation reading location 0x00000010. Это сообщение отредактировал(а) eugeniy - 22.4.2010, 01:25 Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
||||||
|
|||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Так в Card_read() в row ни чего не заносится, может ты заполняешь эту переменную где-то в другом месте? Кстати, MYSQL_ROW не совсем массив строк, как я понял, наверное оператор [] у него возвращает строку. Это сообщение отредактировал(а) Albor - 22.4.2010, 08:26 |
|||
|
||||
eugeniy |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Нет всё заносится в этом методе Card_read() во все переменные row[4], row[5] и т.д....
я функцией mysql_fetch_row в переменную row заношу целый массив строк, а уже потом обрезаю этот массив как мне нужно.т.е если я сделал выборку из трех столбцов то результат у меня соответственно будет находиться в row[0], row[1], row[2]. Таким образом получается как вы и говорите оператор [] возвращает конкретную строку. Если верить C API для MySQL,то MYSQL_ROW - Является ``типобезопасным'' представлением данных одной строки. В настоящее время этот тип реализован как массив строк с фиксированным количеством байтов (их нельзя трактовать как строки с нулевым символом в конце, если величины полей могут содержать двоичные данные, поскольку они могут содержать ноль байтов). Строки можно получить вызовом функции mysql_fetch_row(). Теперь по поводу вывода в контролы диалога этих строк, я их вывел таким путём 1) завёл в классе CReader переменные типа CString, также их продублировал в CReaderDlg
2) затем в Card_read, где я извлёк данные из mysql функцией mysql_fetch_row() и сразу после этого перепресвоил значения переменных row[4] и т.д. этим переменным.
и т.д. 3)а потом уже в CReader::OnInitDialog() после вызова Card_read() делаю
4) в контроле диалога получаю, вместо вывода фамилии вопросительные знаки ??????? смотрел в дебагере, как только захожу в цикл while((row = mysql_fetch_row (res))) то сразу все переменные row заполняются знаками вопросами. Дата вывелась т.к. там цифры, тут видимо какой-то баг с кодировкой, не хочет кириллицу выводить( Видимо тут уже Винда комедит, можете что-нибудь подсказать по этому поводу??? |
||||||||||
|
|||||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Неа не помогает, просто выводит вместо русских букв, знаки вопроса, тут наверно проблема в кодировки. А вы как считаете? |
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
по ходу дела данные выбираются в кодировке latin1, которая стоит в БД по дефолту, поэтому и выводится знаками вопроса "?????"
У меня раньше такая проблема была, када я код писал на С, при выводе на консоль получались кракозябрики, проблема решилась после установки соединения с БД, вызовом команды
После этого все данные отображались корректно, русскими буквами Но применив эту же операцию к нынешнему случаю, только вместо cp866 используя cp1251 ничего не произошло. |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Не знаю, если бы кодировка - были бы кракозябры, а так похоже на 2-х байтные символы. Посмотри что копируется в объект CString, если исходная строка через байт, то разбирайся с Unicode.
|
|||
|
||||
eugeniy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 23.3.2010 Где: Петрозаводск Репутация: нет Всего: нет |
Да, уже разобрался, проблема была на самом деле в кодировки, по дефолту мускульный сервер использует кодировку latin1, а она именно и выводит всю кириллицу в виде знаков вопроса, причём каждая буква - это один знак вопроса.т.е. он всё время возвращал в своей кодировке. Пришлось заюзать функцию mysql_set_character_set(), которая возвращает все значения, через это соединение в нужной мне кодировки автоматически. Таким образом все поля вывелись благополучно))) Только вот теперь не знаю как фото из БД выцепить,и также в интерфейс диалога запихать? Думаю аналогичным образом не прокатит так сделать, тут ведь уже не текстовая информация...Каким образом можно сделать, не подскажите? Спасибо. |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Есть элемент в тулбоксе, называется Picture Control. В его свойствах определи тип "иконка" или "битмап"(что нужно) и размещай в нём картинку.
Это сообщение отредактировал(а) Albor - 27.4.2010, 21:14 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |