VC++ 7.0 & mysql++
От: sas-koval Украина  
Дата: 05.11.06 18:24
Оценка:
нужно написать маленькую прожку по работе с мускульной базой.
делов там — сделать выборку, принять поля из первой записи, определённым образом перебрать данные и удалить эту строчку из БД.
начал ковыряться со стандартными библиотеками типа CRecord CDatabase. там упёрся, что он не хочет открывать CRecord в режиме изменения данных (dynaset) :
cr.Open(CRecordset::dynaset, "SELECT * FROM table");
на каком-то форуме почитал и понял, что эта проблема не только у меня и что нужно писать через АПИ. с сайта мускуля скачал библиотеку mysql++, которая для этого и служит. начал разбираться с хелпом и попробовал компилировать один из тамашних примеров по удалению строки. вроде всё написал как положено. указал где хедеры лежат эти от mysql++.. пришлось скачать исходники мускуля, чтоб оттуда достать ещё несколько хедеров, которые изначально не шли в комплекте с базой. тоже указал вроде пути.. нашёл всё.. но как всегда не компилит. мол синтаксическая ошибка..
стал разбираться. оказывается.. как только я прописал
#include "mysql++.h"
то он выдаёт мне
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(31): error C2059: syntax error : ')'
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(35): error C2059: syntax error : ','
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(29): error C2078: too many initializers
............
и т.д. и т.п.
пробовал компилировать не в режиме дебагера, а в режиме релиза.. тогда выдавал

Proga error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall mysqlpp::Connection::Connection(bool)" (__imp_??0Connection@mysqlpp@@QAE@_N@Z) referenced in function "public: void __thiscall CDVB_serverDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CDVB_serverDlg@@QAEXXZ)
Proga error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall mysqlpp::Connection::~Connection(void)" (__imp_??1Connection@mysqlpp@@UAE@XZ) referenced in function "public: void __thiscall CDVB_serverDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CDVB_serverDlg@@QAEXXZ)
Proga fatal error LNK1120: 2 unresolved externals
..............

я так чувствую, что где-то что-то не подключил.. но он же не говорит где и что

пишу на вижуал 2003-х
база — mysql 5.0.18.win
в общем не выходит пробиться. сталкивался ли кто с таким и как быть дальше.. есть ли у кого какие-то примеры реализации этих АПИ для работы с мускулем.. буду рад унать любую информацию.. и вообще рад любой моральной поддержке

PS. в с++ не очень силён. новичёк.. а тем более в АПИ...

да.. и вопрос к теме.. а есть ли ещё испытаные методу кроме АПИ, для простой работы с мускулем? может как-то через АДО попробовать, но там тоже не совсем понятны некоторые детали.. скажем как с микрософт адо дата контролом управлять данными без использования грида.. т.е. выбирать записи.. удалять.. извлекать данные.. может так проще? ткните пальцем куда-нибудь.. туда и пойду

зарание спасибо.
но стараюсь.
Re: VC++ 7.0 & mysql++
От: Аноним  
Дата: 05.11.06 19:24
Оценка:
Здравствуйте, sas-koval, Вы писали:

SK>нужно написать маленькую прожку по работе с мускульной базой.

С этой штукой не работал.

SK>делов там — сделать выборку, принять поля из первой записи, определённым образом перебрать данные и удалить эту строчку из БД.

А вам для этого точно CRecordset нужен? Не хватит ли средств SQL + ODBC?

SK>начал ковыряться со стандартными библиотеками типа CRecord CDatabase. там упёрся, что он не хочет открывать CRecord в режиме изменения данных (dynaset) :

SK>cr.Open(CRecordset::dynaset, "SELECT * FROM table");
"SELECT * FROM table" — прям так и написано?
Что значит "не хочет открывать"? Как конкретно не хочет?

SK>c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(31): error C2059: syntax error : ')'

SK>c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(35): error C2059: syntax error : ','
SK>c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xdebug(29): error C2078: too many initializers
SK>............
SK>и т.д. и т.п.
SK>пробовал компилировать не в режиме дебагера, а в режиме релиза.. тогда выдавал
Похоже, заголовки конфликтуют, какие нибудь debug макросы, изменение порядка включения заголовков ожет помочь (если повезёт). Возможно, надо задать какие-то директивы препроцессора. Судя по последующему тексту — несолько быстрых движений саперной лопаткой в заголовках mysql++ тоже могут исправить дело.

SK>Proga error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall mysqlpp::Connection::Connection(bool)" (__imp_??0Connection@mysqlpp@@QAE@_N@Z) referenced in function "public: void __thiscall CDVB_serverDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CDVB_serverDlg@@QAEXXZ)

SK>Proga error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall mysqlpp::Connection::~Connection(void)" (__imp_??1Connection@mysqlpp@@UAE@XZ) referenced in function "public: void __thiscall CDVB_serverDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CDVB_serverDlg@@QAEXXZ)
SK>Proga fatal error LNK1120: 2 unresolved externals
SK>..............

SK>я так чувствую, что где-то что-то не подключил.. но он же не говорит где и что

Должен быть либо lib файл с реализацией тех самых методов, либо включайте исходники с реализацией тех самых методов в ваш проект.

SK>PS. в с++ не очень силён.

Заметно. И очень. Начинать надо бы с чего попроще.

SK>да.. и вопрос к теме.. а есть ли ещё испытаные методу кроме АПИ, для простой работы с мускулем? может как-то через АДО попробовать

Если есть OLE DB провайдер для mysql — это хороший вариант. Можно пользоватся ADO поверх ODBC, но тогдa унаследуются все проблемы ODBC.
SK>но там тоже не совсем понятны некоторые детали.. скажем как с микрософт адо дата контролом управлять данными без использования грида.. т.е. выбирать записи.. удалять.. извлекать данные.. может так проще? ткните пальцем куда-нибудь.. туда и пойду
Для работы с АДО вам не нужны никакие адо дата контролы и гриды: у вас есть и вам нужны Connection и Recordset (Command и пр. — по желанию).

SK>но стараюсь.

Не заметно что-то. Уж про АДО гугль вас точно просветил бы. Например http://www.codersource.net/mfc_ado_select.html
Re[2]: VC++ 7.0 & mysql++
От: sas-koval Украина  
Дата: 05.11.06 22:14
Оценка:
SK>>делов там — сделать выборку, принять поля из первой записи, определённым образом перебрать данные и удалить эту строчку из БД.
А>А вам для этого точно CRecordset нужен? Не хватит ли средств SQL + ODBC?

что значит средств? классов? так вроде CRecordset для этого и предназначен..

SK>>начал ковыряться со стандартными библиотеками типа CRecord CDatabase. там упёрся, что он не хочет открывать CRecord в режиме изменения данных (dynaset) :

SK>>cr.Open(CRecordset::dynaset, "SELECT * FROM table");
А>"SELECT * FROM table" — прям так и написано?

да. прям так и было написано.. только слово table в моём проекте заменяется на мою таблицу.. это я для примера написал.

А>Что значит "не хочет открывать"? Как конкретно не хочет?


он говорил, что ваш ОДБЦ драйвер не поддерживает открывания в режиме dynaset. качал само собой последний драйвер с сайта мускуля, но всё равно не работало. после этого на форуме каком-то нашёл, что я не первый с этим долбаюсь и там кто-то сказал, что проще с апи разобраться.. только вот я теперь думаю проще ли

А>Должен быть либо lib файл с реализацией тех самых методов, либо включайте исходники с реализацией тех самых методов в ваш проект.


я указал эти папки в tools-options-project-directories

SK>>PS. в с++ не очень силён.

А>Заметно. И очень. Начинать надо бы с чего попроще.
начинал с чего-то проще, но что делать если задача встала именно такая.. раньше с делфи больше дело имел.. а си только недавно стал разбирать.. хочу научиться. а задача вот такая встала и что тут поделать

SK>>да.. и вопрос к теме.. а есть ли ещё испытаные методу кроме АПИ, для простой работы с мускулем? может как-то через АДО попробовать

А>Если есть OLE DB провайдер для mysql — это хороший вариант. Можно пользоватся ADO поверх ODBC, но тогдa унаследуются все проблемы ODBC.

есть одбц.

А>Для работы с АДО вам не нужны никакие адо дата контролы и гриды: у вас есть и вам нужны Connection и Recordset (Command и пр. — по желанию).


SK>>но стараюсь.

А>Не заметно что-то. Уж про АДО гугль вас точно просветил бы. Например http://www.codersource.net/mfc_ado_select.html

угу.. ладно.. попробую продвинуть этут тему..
спасибо
Re[3]: VC++ 7.0 & mysql++
От: Аноним  
Дата: 06.11.06 10:25
Оценка:
Здравствуйте, sas-koval, Вы писали:

SK>>>делов там — сделать выборку, принять поля из первой записи, определённым образом перебрать данные и удалить эту строчку из БД.

А>>А вам для этого точно CRecordset нужен? Не хватит ли средств SQL + ODBC?

SK>что значит средств? классов? так вроде CRecordset для этого и предназначен..

Значит написать SQL и вызвать SQLExecute? Или ADO::_Connection->Execute(strSQL) (упрощенно). Зачем Recordset? И вашего описания задачи необходимость его иметь неочевидна.

SK>>>начал ковыряться со стандартными библиотеками типа CRecord CDatabase. там упёрся, что он не хочет открывать CRecord в режиме изменения данных (dynaset) :

SK>>>cr.Open(CRecordset::dynaset, "SELECT * FROM table");
А>>"SELECT * FROM table" — прям так и написано?

SK>да. прям так и было написано.. только слово table в моём проекте заменяется на мою таблицу.. это я для примера написал.

А я не телепат. Как можно разобратся где у вас "для примера", а где ошибка?

А>>Что значит "не хочет открывать"? Как конкретно не хочет?


SK>он говорил, что ваш ОДБЦ драйвер не поддерживает открывания в режиме dynaset. качал само собой последний драйвер с сайта мускуля, но всё равно не работало. после этого на форуме каком-то нашёл, что я не первый с этим долбаюсь и там кто-то сказал, что проще с апи разобраться.. только вот я теперь думаю проще ли

А вам обязательно dynaset нужен? Зачем? Он вообще крайне огранниченным число БД (драйверов) поддерживается.

А>>Должен быть либо lib файл с реализацией тех самых методов, либо включайте исходники с реализацией тех самых методов в ваш проект.

SK>я указал эти папки в tools-options-project-directories
Включайе библиотеку или файлы с исходниками, а не указывайе папки.

SK>раньше с делфи больше дело имел

Ваши странные представления о методиках работы с базами данных это выдают.
Re[4]: VC++ 7.0 & mysql++
От: sas-koval Украина  
Дата: 07.11.06 11:13
Оценка:
Здравствуйте, Аноним, Вы писали:

SK>>раньше с делфи больше дело имел

А>Ваши странные представления о методиках работы с базами данных это выдают.
собственно я этого и не скрываю

SK>>что значит средств? классов? так вроде CRecordset для этого и предназначен..

А>Значит написать SQL и вызвать SQLExecute? Или ADO::_Connection->Execute(strSQL) (упрощенно). Зачем Recordset? И вашего описания задачи необходимость его иметь неочевидна.

хм. воспользовался вашим советом. разобрался что такое SQLExecute и еже с ними (теоретически). однако практически снова выходят какие-то траблы.
в частности..

это я в инете нашёл такой примерчик.
сам тут почти ничё не писал.
дело в том, что он попадает на тот exit, чтоя написал.
после
Retcode=SQLSetEnvAttr(hEnv,SQL_ATTR_OUTPUT_NTS,(void*)SQL_TRUE, 0); //Устанавливает атрибуты управления рабочей среды (окружением) эта строка не обязательна.
в Retcode возвращает ошибку. (SQL_ERROR)
если строку закоментировать, то он так же реагирует на следующую строку
Retcode =SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc); //Выделяет память для среды окружения

оригинал примера я взял тут
http://arroba.narod.ru/Regystry/api/obdcapi/APImenu.htm

я не понимаю как искать такие ошибки.

вот собственно начало кода..


#include "windows.h"

SQLHENV hEnv;
SQLHDBC hDbc;
SQLHSTMT hStmt;
SQLRETURN Retcode;
Retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE ,&hEnv );
if (Retcode == SQL_SUCCESS || Retcode == SQL_SUCCESS_WITH_INFO)
{
Retcode=SQLSetEnvAttr(hEnv,SQL_ATTR_OUTPUT_NTS,(void*)SQL_TRUE, 0);
if (Retcode == SQL_ERROR)
{
exit(-1);
}
if(Retcode == SQL_SUCCESS || Retcode == SQL_SUCCESS_WITH_INFO)
{
Retcode =SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc); //при дебаге заметил, что прога в hDbc кладёт 0, чего и следовало бы ожидать при ошибке
....................


что такое "не идёт" и как с этим бороться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.