// 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; }