mysqlt.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. // mysqlt.cpp : 定义应用程序的类行为。
  2. //
  3. #include "stdafx.h"
  4. #include "mysqlt.h"
  5. #include "mysqltDlg.h"
  6. #include "mysql.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. #define _STR_HOST_ "itcivilian.vicp.io"
  11. #define _STR_USER_ "root"
  12. #define _STR_PASSWD_ "root@851208"
  13. #define _STR_DBNAME_ "test"
  14. #define _INT_NAME_ 63
  15. #define _INT_EMAIL 127
  16. #define _INT_DEPAR 255
  17. typedef struct workers_ext{
  18. unsigned int id;
  19. char name[_INT_NAME_+1];
  20. }WorkersExt;
  21. typedef struct
  22. {
  23. unsigned int id;
  24. char name[_INT_NAME_ + 1];
  25. char sex;
  26. char email[_INT_EMAIL + 1];
  27. char department[_INT_DEPAR + 1];
  28. unsigned int employtime; // 入职时间
  29. int salary;
  30. workers_ext ext;
  31. }Workers;
  32. static inline void _mysql_check(MYSQL *pcon)
  33. {
  34. //fprintf(stderr, _T("%s\n"), mysql_error(pcon));
  35. //TRACE0("错误:%s\n", mysql_error(pcon));
  36. OutputDebugString(mysql_error(pcon));
  37. mysql_close(pcon);
  38. //exit(EXIT_FAILURE);
  39. }
  40. static inline void _open()
  41. {
  42. // 创建mysql对象;
  43. MYSQL *pcon = mysql_init(NULL);
  44. if (pcon == NULL)
  45. return;
  46. // 创建连接;
  47. if ( !mysql_real_connect(pcon, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
  48. {
  49. _mysql_check(pcon);
  50. return;
  51. }
  52. // 查询数据库的表;
  53. if ( mysql_query(pcon, "show tables;"))
  54. {
  55. _mysql_check(pcon);
  56. return;
  57. }
  58. // 获取数据;
  59. MYSQL_RES *pres = mysql_store_result(pcon);
  60. if ( pres == NULL )
  61. return _mysql_check(pcon);
  62. MYSQL_ROW row;
  63. unsigned int rlen = mysql_num_fields(pres);
  64. // 打印行数据;
  65. while ( (row = mysql_fetch_row(pres)) )
  66. {
  67. for ( unsigned int i = 0; i < rlen; i++ )
  68. {
  69. //TRACE0("%s\n", row[i]);
  70. OutputDebugString(row[i]);
  71. }
  72. }
  73. // 释放结果内存;
  74. mysql_free_result(pres);
  75. // 释放连接对象;
  76. mysql_close(pcon);
  77. }
  78. #define _INT_INSERTSQL 1024*10
  79. static void _workers_get_insertsql(MYSQL *pcon, Workers& workers)
  80. {
  81. char query[_INT_INSERTSQL + 1];
  82. assert( pcon );
  83. // 保存扩展数据, 2 * size +1 是api规定的, 返回最终编码长度;
  84. char chunk[2 * sizeof(Workers) + 1];
  85. mysql_real_escape_string(pcon, chunk, (const char*)&workers.ext, sizeof(WorkersExt));
  86. int len = sprintf(query,
  87. "insert into tb_user(name, sex, email, department, salary, ext) "
  88. "values('%s', %d, '%s', '%s', %d, '%s');",
  89. workers.name,
  90. workers.sex,
  91. workers.email,
  92. workers.department,
  93. workers.salary,
  94. chunk
  95. );
  96. if ( len > _INT_INSERTSQL )
  97. return;
  98. if ( mysql_real_query(pcon, query, len))
  99. return _mysql_check(pcon);
  100. }
  101. void mariadb_insert()
  102. {
  103. // 创建mysql对象;
  104. MYSQL *pcon = mysql_init(NULL);
  105. if (pcon == NULL)
  106. return;
  107. // 创建连接;
  108. if ( !mysql_real_connect(pcon, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
  109. {
  110. _mysql_check(pcon);
  111. return;
  112. }
  113. // 查询数据库的表;
  114. if ( mysql_query(pcon, "truncate table tb_user;"))
  115. {
  116. _mysql_check(pcon);
  117. return;
  118. }
  119. Workers workers[] = {
  120. { 0, "09.09 毛无敌诞辰", 1, "666666@666.com", "帝王大厦,长江口", -1, 0,{ 2, "09.10 教师节快乐" } },
  121. { 0, "09.10 教师节快乐", 1, "55555@555.com", "各大地毯,松花江", 555, 0,{ 1, "09.09 毛无敌诞辰" } },
  122. };
  123. int len = sizeof(workers)/sizeof(Workers);
  124. // 开始插入数据;
  125. for ( int i = 0; i < len; i++ )
  126. _workers_get_insertsql(pcon, *(workers + i));
  127. // 释放连接对象;
  128. mysql_close(pcon);
  129. }
  130. int mariadb_select() {
  131. // 创建数据连接对象, 需要和 mysql_close成对出现
  132. MYSQL * con = mysql_init(NULL);
  133. if (NULL == con) {
  134. fputs("main mysql_init NULL == con! error !\n", stderr);
  135. exit(EXIT_FAILURE);
  136. }
  137. // 开始创建TCP常连接对象
  138. if (!mysql_real_connect(con, _STR_HOST_, _STR_USER_, _STR_PASSWD_, _STR_DBNAME_, 0, NULL, 0))
  139. _mysql_check(con);
  140. // 这里读取数据
  141. if (mysql_query(con, "select * from tb_user;"))
  142. _mysql_check(con);
  143. /*
  144. * 这里拉取数据
  145. */
  146. MYSQL_RES * res = mysql_store_result(con);
  147. if (NULL == res)
  148. _mysql_check(con);
  149. MYSQL_ROW row;
  150. // 打印行数据
  151. while ((row = mysql_fetch_row(res))) {
  152. // 得到各个列长度
  153. unsigned long * clens = mysql_fetch_lengths(res);
  154. if(NULL == clens)
  155. _mysql_check(con);
  156. // 得到最后一个数据返回
  157. Workers worker;
  158. worker.id = (unsigned)strtoul(row[0], NULL, 0);
  159. strcpy(worker.name, row[1]);
  160. worker.sex = (char)atoi(row[2]);
  161. strcpy(worker.email, row[3]);
  162. strcpy(worker.department, row[4]);
  163. worker.employtime = (unsigned)strtoul(row[5], NULL, 0);
  164. worker.salary = atoi(row[6]);
  165. memcpy(&worker.ext, row[7], clens[7]);
  166. // 简单打印数据
  167. printf("{ %u, '%s', %d, '%s', '%s', %u, %d, { %u, '%s' } }\n",
  168. worker.id, worker.name, worker.sex, worker.email,
  169. worker.department, worker.employtime, worker.salary,
  170. worker.ext.id, worker.ext.name);
  171. }
  172. // 释放结果内存
  173. mysql_free_result(res);
  174. // 释放mysql客户端链接对象
  175. mysql_close(con);
  176. getchar();
  177. return 0;
  178. }
  179. // CmysqltApp
  180. BEGIN_MESSAGE_MAP(CmysqltApp, CWinAppEx)
  181. ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
  182. END_MESSAGE_MAP()
  183. // CmysqltApp 构造
  184. CmysqltApp::CmysqltApp()
  185. {
  186. // TODO: 在此处添加构造代码,
  187. // 将所有重要的初始化放置在 InitInstance 中
  188. }
  189. // 唯一的一个 CmysqltApp 对象
  190. CmysqltApp theApp;
  191. // CmysqltApp 初始化
  192. BOOL CmysqltApp::InitInstance()
  193. {
  194. // 如果一个运行在 Windows XP 上的应用程序清单指定要
  195. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  196. //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
  197. INITCOMMONCONTROLSEX InitCtrls;
  198. InitCtrls.dwSize = sizeof(InitCtrls);
  199. // 将它设置为包括所有要在应用程序中使用的
  200. // 公共控件类。
  201. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  202. InitCommonControlsEx(&InitCtrls);
  203. CWinAppEx::InitInstance();
  204. AfxEnableControlContainer();
  205. mariadb_select();
  206. // 标准初始化
  207. // 如果未使用这些功能并希望减小
  208. // 最终可执行文件的大小,则应移除下列
  209. // 不需要的特定初始化例程
  210. // 更改用于存储设置的注册表项
  211. // TODO: 应适当修改该字符串,
  212. // 例如修改为公司或组织名
  213. SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
  214. CmysqltDlg dlg;
  215. m_pMainWnd = &dlg;
  216. INT_PTR nResponse = dlg.DoModal();
  217. if (nResponse == IDOK)
  218. {
  219. // TODO: 在此放置处理何时用
  220. // “确定”来关闭对话框的代码
  221. }
  222. else if (nResponse == IDCANCEL)
  223. {
  224. // TODO: 在此放置处理何时用
  225. // “取消”来关闭对话框的代码
  226. }
  227. // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  228. // 而不是启动应用程序的消息泵。
  229. return FALSE;
  230. }