123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- // mysqlt.cpp : 定义应用程序的类行为。
- //
- #include "stdafx.h"
- #include "mysqlt.h"
- #include "mysqltDlg.h"
- #include "mysql.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- #define _STR_HOST_ "itcivilian.vicp.io"
- #define _STR_USER_ "root"
- #define _STR_PASSWD_ "root@851208"
- #define _STR_DBNAME_ "test"
- #define _INT_NAME_ 63
- #define _INT_EMAIL 127
- #define _INT_DEPAR 255
- typedef struct workers_ext{
- unsigned int id;
- char name[_INT_NAME_+1];
- }WorkersExt;
- typedef struct
- {
- unsigned int id;
- char name[_INT_NAME_ + 1];
- char sex;
- char email[_INT_EMAIL + 1];
- char department[_INT_DEPAR + 1];
- unsigned int employtime; // 入职时间
- int salary;
- workers_ext ext;
- }Workers;
- static inline void _mysql_check(MYSQL *pcon)
- {
- //fprintf(stderr, _T("%s\n"), mysql_error(pcon));
- //TRACE0("错误:%s\n", mysql_error(pcon));
- OutputDebugString(mysql_error(pcon));
- mysql_close(pcon);
- //exit(EXIT_FAILURE);
- }
- static inline void _open()
- {
- // 创建mysql对象;
- MYSQL *pcon = mysql_init(NULL);
- if (pcon == NULL)
- return;
- // 创建连接;
- if ( !mysql_real_connect(pcon, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
- {
- _mysql_check(pcon);
- return;
- }
- // 查询数据库的表;
- if ( mysql_query(pcon, "show tables;"))
- {
- _mysql_check(pcon);
- return;
- }
- // 获取数据;
- MYSQL_RES *pres = mysql_store_result(pcon);
- if ( pres == NULL )
- return _mysql_check(pcon);
- MYSQL_ROW row;
- unsigned int rlen = mysql_num_fields(pres);
- // 打印行数据;
- while ( (row = mysql_fetch_row(pres)) )
- {
- for ( unsigned int i = 0; i < rlen; i++ )
- {
- //TRACE0("%s\n", row[i]);
- OutputDebugString(row[i]);
- }
- }
- // 释放结果内存;
- mysql_free_result(pres);
- // 释放连接对象;
- mysql_close(pcon);
- }
- #define _INT_INSERTSQL 1024*10
- static void _workers_get_insertsql(MYSQL *pcon, Workers& workers)
- {
- char query[_INT_INSERTSQL + 1];
- assert( pcon );
- // 保存扩展数据, 2 * size +1 是api规定的, 返回最终编码长度;
- char chunk[2 * sizeof(Workers) + 1];
- mysql_real_escape_string(pcon, chunk, (const char*)&workers.ext, sizeof(WorkersExt));
- int len = sprintf(query,
- "insert into tb_user(name, sex, email, department, salary, ext) "
- "values('%s', %d, '%s', '%s', %d, '%s');",
- workers.name,
- workers.sex,
- workers.email,
- workers.department,
- workers.salary,
- chunk
- );
- if ( len > _INT_INSERTSQL )
- return;
- if ( mysql_real_query(pcon, query, len))
- return _mysql_check(pcon);
- }
- void mariadb_insert()
- {
- // 创建mysql对象;
- MYSQL *pcon = mysql_init(NULL);
- if (pcon == NULL)
- return;
- // 创建连接;
- if ( !mysql_real_connect(pcon, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
- {
- _mysql_check(pcon);
- return;
- }
- // 查询数据库的表;
- if ( mysql_query(pcon, "truncate table tb_user;"))
- {
- _mysql_check(pcon);
- return;
- }
- Workers workers[] = {
- { 0, "09.09 毛无敌诞辰", 1, "666666@666.com", "帝王大厦,长江口", -1, 0,{ 2, "09.10 教师节快乐" } },
- { 0, "09.10 教师节快乐", 1, "55555@555.com", "各大地毯,松花江", 555, 0,{ 1, "09.09 毛无敌诞辰" } },
- };
- int len = sizeof(workers)/sizeof(Workers);
- // 开始插入数据;
- for ( int i = 0; i < len; i++ )
- _workers_get_insertsql(pcon, *(workers + i));
- // 释放连接对象;
- mysql_close(pcon);
- }
- int mariadb_select() {
- // 创建数据连接对象, 需要和 mysql_close成对出现
- MYSQL * con = mysql_init(NULL);
- if (NULL == con) {
- fputs("main mysql_init NULL == con! error !\n", stderr);
- exit(EXIT_FAILURE);
- }
- // 开始创建TCP常连接对象
- if (!mysql_real_connect(con, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
- _mysql_check(con);
- // 这里读取数据
- if (mysql_query(con, "select * from tb_user;"))
- _mysql_check(con);
- /*
- * 这里拉取数据
- */
- MYSQL_RES * res = mysql_store_result(con);
- if (NULL == res)
- _mysql_check(con);
- MYSQL_ROW row;
- // 打印行数据
- while ((row = mysql_fetch_row(res))) {
- // 得到各个列长度
- unsigned long * clens = mysql_fetch_lengths(res);
- if(NULL == clens)
- _mysql_check(con);
- // 得到最后一个数据返回
- Workers worker;
- worker.id = (unsigned)strtoul(row[0], NULL, 0);
- strcpy(worker.name, row[1]);
- worker.sex = (char)atoi(row[2]);
- strcpy(worker.email, row[3]);
- strcpy(worker.department, row[4]);
- worker.employtime = (unsigned)strtoul(row[5], NULL, 0);
- worker.salary = atoi(row[6]);
- memcpy(&worker.ext, row[7], clens[7]);
- // 简单打印数据
- printf("{ %u, '%s', %d, '%s', '%s', %u, %d, { %u, '%s' } }\n",
- worker.id, worker.name, worker.sex, worker.email,
- worker.department, worker.employtime, worker.salary,
- worker.ext.id, worker.ext.name);
- }
- // 释放结果内存
- mysql_free_result(res);
- // 释放mysql客户端链接对象
- mysql_close(con);
- getchar();
- return 0;
- }
- // CmysqltApp
- BEGIN_MESSAGE_MAP(CmysqltApp, CWinAppEx)
- ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
- END_MESSAGE_MAP()
- // CmysqltApp 构造
- CmysqltApp::CmysqltApp()
- {
- // TODO: 在此处添加构造代码,
- // 将所有重要的初始化放置在 InitInstance 中
- }
- // 唯一的一个 CmysqltApp 对象
- CmysqltApp theApp;
- // CmysqltApp 初始化
- BOOL CmysqltApp::InitInstance()
- {
- // 如果一个运行在 Windows XP 上的应用程序清单指定要
- // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
- //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
- INITCOMMONCONTROLSEX InitCtrls;
- InitCtrls.dwSize = sizeof(InitCtrls);
- // 将它设置为包括所有要在应用程序中使用的
- // 公共控件类。
- InitCtrls.dwICC = ICC_WIN95_CLASSES;
- InitCommonControlsEx(&InitCtrls);
- CWinAppEx::InitInstance();
- AfxEnableControlContainer();
- mariadb_select();
- // 标准初始化
- // 如果未使用这些功能并希望减小
- // 最终可执行文件的大小,则应移除下列
- // 不需要的特定初始化例程
- // 更改用于存储设置的注册表项
- // TODO: 应适当修改该字符串,
- // 例如修改为公司或组织名
- SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
- CmysqltDlg dlg;
- m_pMainWnd = &dlg;
- INT_PTR nResponse = dlg.DoModal();
- if (nResponse == IDOK)
- {
- // TODO: 在此放置处理何时用
- // “确定”来关闭对话框的代码
- }
- else if (nResponse == IDCANCEL)
- {
- // TODO: 在此放置处理何时用
- // “取消”来关闭对话框的代码
- }
- // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
- // 而不是启动应用程序的消息泵。
- return FALSE;
- }
|