[
  {
    "path": "C++封装MySQL数据库连接器类和消息管理类.cpp",
    "content": "#include <iostream>\n#include <fstream>\n#include <string>\n#include <vector>\n#include <ctime>\n#include <stdexcept>\n#include <unordered_map>\n#include <windows.h> //必须在包含mysql.h之前包含windows.h\n#include <mysql.h>\n\nusing std::string;\nusing std::vector;\nusing std::endl;\n\n///数据库连接器类,负责连接数据库,并封装基本的数据库相关操作\nclass DB_Connector {\nprotected:\n    MYSQL* mysql;\npublic:\n    static string host_, user_, passwd_, db_;\npublic:\n    inline DB_Connector();\n    inline virtual ~DB_Connector();\n    //执行sql语句,成功则返回0,失败返回非0\n    inline int query(const string& sql);\n    //返回上一次的错误提示\n    inline string error();\n    //获取结果集,将其保存到二维string数组中\n    inline vector<vector<string> > getResult();\n};\n\nDB_Connector::DB_Connector()\n{\n    mysql = mysql_init(NULL);\n    if (mysql_real_connect(mysql, host_.c_str(), user_.c_str(),\n                           passwd_.c_str(), db_.c_str(), 0, 0, 0) == 0) {\n        string err = \"Failed to connect database server: \" + error();\n        throw std::logic_error(err);\n    }\n    query(\"set names 'GBK'\");//设置字符集,防止中文出现乱码\n}\n\nDB_Connector::~DB_Connector()\n{\n    mysql_close(mysql);\n}\n\n//执行sql语句,成功则返回0,失败返回非0\nint DB_Connector::query(const string& sql)\n{\n    return mysql_query(mysql, sql.c_str());\n}\n\n//返回上一次的错误提示\nstring DB_Connector::error()\n{\n    return mysql_error(mysql);\n}\n\n//获取结果集,将其保存到二维string数组中\nvector<vector<string> > DB_Connector::getResult()\n{\n    vector<vector<string> >result;\n    MYSQL_RES* res = mysql_store_result(mysql);\n    if (res == NULL)\n        return result;\n    unsigned num = mysql_num_fields(res); //结果集的列数\n    for (MYSQL_ROW row; (row = mysql_fetch_row(res)) != NULL;) {\n        result.push_back(vector<string>(num));\n        for (size_t cur = result.size() - 1, i = 0; i < num; ++i) {\n            result[cur][i] = row[i];\n        }\n    }\n    mysql_free_result(res); //释放结果集资源\n    return result;\n}\n\n\n///消息管理类\nclass DB_Msg {\nprotected:\n    DB_Connector db_conn; //数据库连接器对象\n    const string tbName;  //要操作的表名\n    std::ofstream fsLog;  //日志记录文件流\npublic:\n    inline DB_Msg(const string& _tableName, const string& _logFileName);\n    inline virtual ~DB_Msg();\n    //添加消息\n    inline void push(const string& to, const string& from, const string& msg);\n    //获取执行指定sql语句后的结果\n    inline vector<vector<string> > getBySql(const string& sql);\n    //根据指定sql语句删除相应记录\n    inline void removeBySql(const string& sql);\n    //获取当前日期和时间,用于更新日志\n    inline static string getTime();\nprotected:\n    //创建存储聊天记录的表\n    inline void createTable();\n};\n\nDB_Msg::DB_Msg(const string& _tableName, const string& _logFileName)\n    : tbName(_tableName)\n{\n    if (_logFileName != \"\") {\n        fsLog.open(_logFileName, std::ios::app);\n    }\n    createTable();\n}\n\nDB_Msg::~DB_Msg()\n{\n    if (fsLog) {\n        fsLog.close();\n    }\n}\n//添加消息\nvoid DB_Msg::push(const string& to, const string& from, const string& msg)\n{\n    string sql = \"insert into \" + tbName + \"(toUser,fromUser,msg) values('\"\n                 + to + \"','\" + from + \"','\" + msg + \"')\";\n    if (fsLog) {\n        fsLog << getTime() << \">>>execute: \" + sql << endl;\n    }\n    if (db_conn.query(sql) != 0 && fsLog) { //执行sql语句失败返回非0\n        fsLog << \"Failed to insert: \" << db_conn.error() << endl;\n    }\n}\n//获取执行指定sql语句后的结果\nvector<vector<string> > DB_Msg::getBySql(const string& sql)\n{\n    vector<vector<string> >result;\n    if (fsLog) {\n        fsLog << getTime() << \">>>execute: \" + sql << endl;\n    }\n    if (db_conn.query(sql) == 0) {   //执行成功则把结果输出\n        result = db_conn.getResult();\n    } else if (fsLog) {\n        fsLog << \"Failed to search: \" << db_conn.error() << endl;\n    }\n    return result;\n}\n//根据指定sql语句删除相应记录\nvoid DB_Msg::removeBySql(const string& sql)\n{\n    if (fsLog) {\n        fsLog << getTime() << \">>>execute: \" << sql << endl;\n    }\n    if (db_conn.query(sql) != 0 && fsLog) {\n        fsLog << \"Failed to delete: \" << db_conn.error() << endl;\n    }\n}\n//获取当前日期和时间,用于更新日志\ninline string DB_Msg::getTime()\n{\n    char time_buf[64];\n    time_t now_time = time(NULL);\n    strftime(time_buf, 64, \"%Y-%m-%d %H:%M:%S \", localtime(&now_time));\n    return time_buf;\n}\n//创建存储聊天记录的表\nvoid DB_Msg::createTable()\n{\n    db_conn.query(\"show tables like '\" + tbName + \"'\");\n    auto res = db_conn.getResult();\n    if (res.size() > 0 && res[0][0] == tbName) {\n        return;\n    }\n    string sql = \"CREATE TABLE `\" + tbName + \"` (\"\n                 \"`id` tinyint(4) NOT NULL AUTO_INCREMENT,\"\n                 \"`toUser` varchar(20) NOT NULL,\"\n                 \"`fromUser` varchar(20) NOT NULL,\"\n                 \"`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\"\n                 \"`msg` text NOT NULL,\"\n                 \"PRIMARY KEY (`id`)\"\n                 \") ENGINE=InnoDB DEFAULT CHARSET=utf8;\";\n    if (fsLog) {\n        fsLog << getTime() << \">>>execute: \" << sql << endl;\n    }\n    if (db_conn.query(sql) != 0 && fsLog) {\n        fsLog << \"Failed to create: \" << db_conn.error() << endl;\n    }\n}\n\n\n///离线消息管理类 - 仅用于服务器端\nclass DB_OfflineMsg : public DB_Msg {\npublic:\n    DB_OfflineMsg(const string& _tableName, const string _logFileName = \"\")\n        : DB_Msg(_tableName, _logFileName)\n    {}\n    //从离线消息表中得到所有发送给user的消息,提取完后从数据库删除\n    inline vector<vector<string> > pop(const string& user);\n};\n\n//从离线消息表中得到所有发送给user的消息,提取完后从数据库删除\nvector<vector<string> > DB_OfflineMsg::pop(const string& user)\n{\n    string sql = \"select fromUser,time,msg from \" + tbName\n                 + \" where toUser='\" + user + \"'\";\n    vector<vector<string> >result = getBySql(sql);\n    //删除发给user的所有消息\n    if (result.size() > 0) {\n        sql = \"delete from \" + tbName + \" where toUser='\" + user + \"'\";\n        removeBySql(sql);\n    }\n    return result;\n}\n\n///聊天记录消息管理类\nclass DB_ChatLogMsg : public DB_Msg {\npublic:\n    //用户名标识用户,日志文件名为空时不建立前缀用于区分是在客户端还是服务器端\n    inline DB_ChatLogMsg(const string& _userName, const string _logFileName = \"\",\n                         const string& _prefix = \"\")\n        : DB_Msg(_prefix + \"chat_log_\" + _userName, _logFileName), userName(_userName)\n    {}\n    //添加聊天记录消息\n    inline void push(const string& userOthers, const string& msg, bool isReceived = 1);\n    //添加收到的带时间记录的离线消息\n    inline void pushOffline(const string& from, const string& msg, const string& _time);\n    //获取消息user发来的或发给user的所有消息\n    inline vector<vector<string> > get(const string& user);\n    //在该用户的聊天记录中查找与withUser的包含str的消息记录\n    inline vector<vector<string> > find(const string& str, const string& withUser = \"*\");\n    //根据传递的用户名删除与对应用户的聊天记录,传入\"*\"则删除所有记录\n    inline void remove(const string& user);\n    //获取与当前用户有聊天记录的用户列表\n    inline vector<string> getUserWithChatLog();\n    //获取当前用户的用户名\n    inline const string& getUserName();\nprotected:\n    string userName; //该用户的用户名\n};\n\n//添加聊天记录消息\nvoid DB_ChatLogMsg::push(const string& userOthers, const string& msg, bool isReceived)\n{\n    if (isReceived) { //收到消息\n        DB_Msg::push(userName, userOthers, msg);\n    } else { //发送消息\n        DB_Msg::push(userOthers, userName, msg);\n    }\n}\n//添加收到的带时间记录的离线消息\nvoid DB_ChatLogMsg::pushOffline(const string& from, const string& msg,\n                                const string& _time)\n{\n    string sql = \"insert into \" + tbName + \"(toUser,fromUser,time,msg) values('\"\n                 + userName + \"','\" + from + \"','\" + _time + \"','\" + msg + \"')\";\n    if (fsLog) {\n        fsLog << getTime() << \">>>execute: \" + sql << endl;\n    }\n    if (db_conn.query(sql) != 0 && fsLog) { //执行sql语句失败返回非0\n        fsLog << \"Failed to insert: \" << db_conn.error() << endl;\n    }\n}\n//获取消息user发来的或发给user的所有消息\nvector<vector<string> > DB_ChatLogMsg::get(const string& user)\n{\n    string sql = \"select fromUser,time,msg from \" + tbName +\n                 \" where toUser='\" + user + \"' or fromUser='\" + user + \"'\";\n    return getBySql(sql);\n}\n//在该用户的聊天记录中查找与withUser的包含str的消息记录\nvector<vector<string> > DB_ChatLogMsg::find(const string& str, const string& withUser)\n{\n    string sql = \"select fromUser,toUser,time,msg from \" + tbName + \" where \";\n    if (withUser != \"*\") {\n        sql += \"(toUser='\" + withUser + \"' or fromUser='\" + withUser + \"') and\";\n    }\n    sql += \" msg like '%\" + str + \"%'\";\n    return getBySql(sql);\n}\n//根据传递的用户名删除与用户user的聊天记录,传入\"*\"则删除所有记录\nvoid DB_ChatLogMsg::remove(const string& user)\n{\n    string sql = \"delete from \" + tbName;\n    if (user != \"*\") {\n        sql += \" where toUser='\" + user + \"' or fromUser='\" + user + \"'\";\n    }\n    removeBySql(sql);\n}\n//获取与当前用户有聊天记录的用户列表\nvector<string> DB_ChatLogMsg::getUserWithChatLog()\n{\n    string sql = \"select distinct toUser from \" + tbName;\n    auto users = getBySql(sql);\n    std::unordered_map<string, bool> userList;\n    for (auto &elem : users) {\n        userList[elem[0]];\n    }\n    sql = \"select distinct fromUser from \" + tbName;\n    users = getBySql(sql);\n    for (auto &elem : users) {\n        userList[elem[0]];\n    }\n    userList.erase(userList.find(userName)); //删除用户列表中的自己\n    //将结果保存到vector<string>中返回\n    vector<string> res;\n    res.reserve(userList.size());\n    for (auto &it : userList) {\n        res.push_back(it.first);\n    }\n    return res;\n}\n\n//获取当前用户的用户名\ninline const string& DB_ChatLogMsg::getUserName()\n{\n    return userName;\n}\n\nusing std::cout;\n//可直接输出查询结果\ninline std::ostream& operator<<(std::ostream& out, const vector<vector<string> >& res)\n{\n    if (res.size() == 0) {\n        cout << \"暂无内容可显示!\" << endl;\n        return out;\n    }\n    for (auto &it : res) { //显示提取出的离线消息内容\n        for (auto &elem : it) {\n            cout << elem << \" \";\n        }\n        cout << endl;\n    }\n    return out;\n}\n\n\nstring DB_Connector::host_ = \"localhost\";\nstring DB_Connector::user_ = \"root\";\nstring DB_Connector::passwd_ = \"123456\";\nstring DB_Connector::db_ = \"mfc_qq\";\n\nusing namespace std;\nint main()\n{\n    DB_OfflineMsg off_msg(\"offline_msg\", \"offileMsg.log\");\n    off_msg.push(\"to\", \"from\", \"hey\");   //存入一条离线消息\n    auto res = off_msg.pop(\"to\"); //读取发给该用户的全部离线消息\n    cout << res << endl;\n\n    DB_ChatLogMsg clMsg(\"Bob\", \"chat_log_Bob.log\");\n    clMsg.push(\"Miranda-lym\", \"hello\", 0);\n    clMsg.push(\"Miranda-lym\", \"hi!\", 1);\n    clMsg.push(\"Miranda-lym\", \"this a test case!\", 0);\n    clMsg.push(\"Miranda-lym\", \"soga,I get it!\", 1);\n    clMsg.push(\"John\", \"what are you doing!\", 1);\n    cout << clMsg.get(\"Miranda-lym\") << endl;\n\n    cout << \"find 'hi':\\n\" << clMsg.find(\"hi\") << endl;\n\n    auto userList = clMsg.getUserWithChatLog();\n    cout << \"users that have chated with \" <<clMsg.getUserName()<<endl;\n         for (auto &elem : userList)\n             cout << elem << endl;\n    cin.get();\n    return 0;\n}\n"
  },
  {
    "path": "MySQL常用操作及用法.cpp",
    "content": "#include <windows.h> //必须在包含mysql.h之前包含windows.h\n#include <mysql.h>\n#include <stdio.h>\n\nint main()\n{\n    char SqlText[256] = \"\";  //将用来保存要执行的SQL语句\n    MYSQL *conn = NULL;      //MYSQL句柄类型(任何一个mysql操作都是基于MYSQL这个句柄来操作的)\n    MYSQL_RES *res = NULL;   //数据查询结果集\n    MYSQL_FIELD * fd = NULL; //MySQL表头域类型\n    MYSQL_ROW row;           //一个行数据的类型安全(type-safe)的表示\n    conn = mysql_init(NULL); //初始化MYSQL连接\n    char  server[20] = \"localhost\"; //mysql服务器的IP\n    char  user[20] = \"root\";        //用户名\n    char  psd[20] = \"123456\";       ///密码  需要改为自己的密码\n    char  dbName[1024] = \"test\";    ///数据库名 需要改为自己的数据库名\n    unsigned short port = 3306;     //服务器端口号,默认3306\n    ///建立mysql连接\n    if(mysql_real_connect(conn, server, user, psd, dbName, port, NULL, 0)==0) {\n        printf(\"Error connecting to database: %s\\n\", mysql_error(conn));\n    } else {\n        puts(\"数据库连接成功！\");\n        mysql_query(conn, \"set names 'GBK'\");//设置字符集,防止中文无法正常显示[可选操作]\n        ///下面开始对数据库进行操作\n        const char tableName[30] = \"UserInfo\";//要操作的表名\n        //插入\n        sprintf(SqlText, \"insert into %s(userName,passwd) values('%s','%s')\", tableName, \"test1\", \"test1\");\n        printf(\">>>执行: %s\\n\", SqlText);\n        if (mysql_query(conn, SqlText) != 0) { //执行sql语句,执行成功返回0\n            printf(\"Can't insert data to table: \");\n            printf(\"%s\\n\", mysql_error(conn)); //获取最后一次查询失败的错误提示\n        }\n        //删除\n        sprintf(SqlText, \"delete from %s where userName='test1'\", tableName);\n        printf(\"将执行删除语句 %s, 按y/Y确认!\", SqlText);\n        char c = getchar();\n        if(c == 'y' || c == 'Y') {\n            printf(\">>>执行: %s\\n\", SqlText);\n            if (mysql_query(conn, SqlText) != 0) { //执行sql语句\n                printf(\"Can't delete data from table: \");\n                printf(\"%s\\n\", mysql_error(conn)); //获取最后一次查询失败的错误提示\n            }\n        }\n        //查找\n        sprintf(SqlText, \"select * from %s where type='0'\", tableName);\n        if (mysql_query(conn, SqlText)==0) {       //执行成功则把结果输出\n            res = mysql_store_result( conn );      //存储查询得到的结果集\n            printf(\">>>执行: %s\\nrecords nums:\", SqlText);\n            printf(\"%u\\n\\n\", mysql_num_rows(res)); //获取搜索到的结果集的条数\n            //输出数据结果各字段名,即表头被选取的部分\n            while((fd = mysql_fetch_field(res)) != NULL) {\n                printf(\"%-10s \", fd->name);\n            }\n            puts(\"\");\n            //打印获取的数据\n            int fieldNums = mysql_num_fields(res); //获取数据结果每条记录的列数\n            while ((row = mysql_fetch_row(res)) != NULL) { //不断获取下一组结果\n                for(int i = 0; i < fieldNums; i++) {\n                    printf(\"%-10s \", row[i]);\n                }\n                puts(\"\");\n            }\n            mysql_free_result(res); //释放结果集资源\n        } else {\n            printf(\"查询失败: %s\\n\", mysql_error(conn));\n        }\n        //修改\n        sprintf(SqlText, \"update %s set passwd='passwd' where id='2'\", tableName);\n        printf(\">>>执行: %s\\n\", SqlText);\n        if (mysql_query(conn, SqlText) != 0) { //执行sql语句\n            printf(\"Can't update data on table: \");\n            printf(\"%s\\n\", mysql_error(conn)); //获取最后一次查询失败的错误提示\n        }\n    }\n    mysql_close(conn); //关闭连接，即释放连接\n    getchar();\n    return 0;\n}\n"
  },
  {
    "path": "MySQL环境配置.md",
    "content": "###最好安装32位的MySQL\n*  1.把libmysql.dll复制到C:/windows/system32/  （若是32位系统）和C:/windows/sysWOW64/  （若是64位系统）下\n\n*  2.配置好IDE：<br/>\n（1）添加包含目录：【安装位置\\MySQL Server 5.6\\include】<br/>\n（2）添加库目录：【安装位置\\MySQL Server 5.6\\lib】<br/>\n（3）让IDE包含必要的链接库文件：【安装位置\\MySQL Server 5.6\\lib\\libmysql.lib】(vs中一般为‘链接器’-‘输入’-‘附加依赖项’:添加libmysql.lib)\n\n*  3.运行【安装位置\\MySQL Server 5.6\\bin】目录下的mysqld.exe，注意每次使用前都需要让这个后台运行\n"
  },
  {
    "path": "README.md",
    "content": "# MySQL_Tools\n使用C和C++连接MySQL数据库并进行常用的数据库操作。实现了简单的学生（或职工）信息管理系统，源于大学时的数据库课程设计。\n\n如果觉得有用，欢迎大家star，同时也欢迎fork后贡献代码提交PR\n"
  },
  {
    "path": "Untitled Diagram.drawio",
    "content": "<mxfile host=\"app.diagrams.net\" modified=\"2020-09-25T08:18:38.849Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36\" version=\"13.7.5\" etag=\"7J6MTeK9uUZDT9PdZtWV\" type=\"github\"><diagram id=\"C5RBs43oDa-KdzZeNtuy\" name=\"Page-1\">7VhZc9MwEP41Hp5gfBQnecRp0wKhU2ihw6NiK7aI7DWynINfzyqWYzsOOYD0yDQv0a43K2m/b4/YcPrx/FKQNPoEAeWGbQZzwzk3bNuybQe/lGZRaLq9bqEIBQu0UaW4Zb+oVppam7OAZg1DCcAlS5tKH5KE+rKhI0LArGk2Bt7cNSUhbSlufcLb2nsWyEjfwu5U+ivKwqjc2XJ7xZOYlMb6JllEApjVVM6F4fQFgCxW8bxPuQpeGZf794t7Ppy4lx8+Zz/JV+/j3fW314WzwSE/WV1B0ET+X9d24XpKeK7jpe8qF2UABeRJQJUT03C8SMYclxYuf1ApFxpwkktAFQgZQQgJ4UOAVNuNIZHazFIyTYJ3CliURxz8SaEaMM71Hihp+y5KmRQwWWGnHKyAUMacjCj3iD8JlwftAweBjxJIqHIVIBn0XarDXVRab8/YagwyyIVPt9jpbJFEhHSbP7ewU+er8VQjd0khplIs0EBQTiSbNslMdE6EK7sKd1xo6A+ggdOiwZDEqcp6oFnySuJqBmKyhRsKl1nEJL1NyTJAMywnTb7UeYBX9UJOskyjuAPkw0CaUiHpfGtYy6euzu2yuGlxVlUKq0z/qFYlzswjAXHWAuI7Fs+XlPyXlHT3TMmyY+3MSU2Wkhh7p6j2dAMskTUTGI8zPNg6dVYb/j2b3rbYdA0tMu3G41nT7ZHI1DmMS9aT55L7hxbhcgyDNxK4CtUq5XkYIlnQXWI4g3btiiAe5dnudtHAWDFoQGLGVbyuKJ9SyXyyoakQzkLc99xHuKnYTB7ckiUhSm4l3S3JivX3iM2m02w2K7nebcwN3aZ7rG7TaWF6g+gV0NkmX+J7Yh3fsddA6D12y+/uU6SfdQl+8I5fVtPdLd/as0xr9phvHPw0CPT0p4DeXjPlyxhwHIbZpzYIlCes8cnL+ag9CYxykSwHAcjlyySwbRKwNzWhB50EykJYA/ULTQlDMM3hKc4B6//8z5zHngPKStGEgKuY2maRYSeGwfos5ljHwwDF6k1tUQqr993OxW8=</diagram></mxfile>"
  },
  {
    "path": "备用命令行代码及数据库表/stu.sql",
    "content": "﻿/*\nNavicat MySQL Data Transfer\n\nSource Server         : 测试1\nSource Server Version : 50616\nSource Host           : localhost:3306\nSource Database       : test\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50616\nFile Encoding         : 65001\n\nDate: 2014-05-11 00:37:03\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\nset names utf8;\n\n-- ----------------------------\n-- Table structure for `stu`\n-- ----------------------------\nDROP TABLE IF EXISTS `stu`;\nCREATE TABLE `stu` (\n  `Sno` char(12) NOT NULL DEFAULT '',\n  `Sname` char(20) DEFAULT NULL,\n  `Ssex` char(2) DEFAULT NULL,\n  `Sage` smallint(6) DEFAULT NULL,\n  `Sdept` char(20) DEFAULT NULL,\n  PRIMARY KEY (`Sno`),\n  UNIQUE KEY `Sno` (`Sno`),\n  UNIQUE KEY `Sno_2` (`Sno`),\n  UNIQUE KEY `Sname` (`Sname`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of stu\n-- ----------------------------\nINSERT INTO `stu` VALUES ('121031325', '卫', '男', '22', '计算机学院');\nINSERT INTO `stu` VALUES ('121031329', '闻', '男', '20', '计算机学院');\nINSERT INTO `stu` VALUES ('121031323', '文', '男', '21', '计算机学院');\nINSERT INTO `stu` VALUES ('121031324', '罗', '男', '21', '计算机学院');\nINSERT INTO `stu` VALUES ('121031326', '郭王', '男', '22', '计算机学院');\n"
  },
  {
    "path": "备用命令行代码及数据库表/workers.sql",
    "content": "﻿drop table if exists workers;\nCREATE TABLE `workers` (\n  编号 char(12) NOT NULL,\n  姓名 char(10) DEFAULT NULL,\n  性别 char(2) DEFAULT '男' check(Wsex in('男','女')),\n  出生年月 char(8) DEFAULT NULL,\n  工作月数 int(11) DEFAULT '0' check(WworkTime>=0),\n  学历 char(10) DEFAULT NULL,\n  职务 char(20) DEFAULT NULL,\n  住址 char(30) DEFAULT NULL,\n  电话 char(12) DEFAULT NULL,\n  PRIMARY KEY (编号)\n) ENGINE=InnoDB DEFAULT CHARSET=gbk;\n\nINSERT INTO `workers` VALUES ('001', '甲', '男', '1993.2', '1', '本科', '普通员工', '北京', '010-1111111');\nINSERT INTO `workers` VALUES ('002', '乙', '女', '1990.3', '16', '本科', '主管', '北京', '010-1111222');\nINSERT INTO `workers` VALUES ('003', '丙', '男', '1992.2', '1', '本科', '普通员工', '武汉', '027-1234123');\nINSERT INTO `workers` VALUES ('004', '丁', '女', '1993.1', '3', '本科', '普通员工', '武汉', '027-1234567');\n"
  },
  {
    "path": "备用命令行代码及数据库表/打开mysql.bat",
    "content": "mysql -h localhost -u root -p php_db1 < stu.sql\npause\nselect * from stu;"
  },
  {
    "path": "备用命令行代码及数据库表/打开命令行.bat",
    "content": "cmd.exe"
  },
  {
    "path": "备用命令行代码及数据库表/打开命令行操作mysql.bat",
    "content": "mysql -h localhost -u root -p test\n\n\nshow databases;\nuse test;\nshow tables;\ndescribe stu;\nselect * from stu;"
  },
  {
    "path": "测试连接.cpp",
    "content": "#include <stdio.h>\n#include <winsock.h>\n#include <mysql.h>\n#include <string.h>\n#pragma comment( lib, \"libmysql.lib\")\n\nint main()\n{\n/// 例子1\n    puts(\"测试1...(链接)\");\n    //MYSQL句柄   (任何一个mysql操作都是基于MYSQL这个句柄来操作的)\n    MYSQL* link_ = mysql_init(NULL);             //初始化MYSQL句柄\n    //设置超时时间(链接超时时间，查询超时时间，写数据库超时时间)\n    int  timeout =  3;                      //超时时间设置为3秒\n    if(link_ != NULL) {\n        mysql_options(link_,MYSQL_OPT_CONNECT_TIMEOUT,(const char *)&timeout);\n        //设置链接超时时间.\n        mysql_options(link_,MYSQL_OPT_READ_TIMEOUT,(const char *)&timeout);\n        //设置查询数据库(select)超时时间\n        mysql_options(link_,MYSQL_OPT_WRITE_TIMEOUT,(const char *)&timeout);\n        //设置写数据库(update,delect,insert,replace等)的超时时间。\n    }\n    //真正建立mysql链接\n    char  host_name[1024] = \"localhost\";\t\t//mysql服务器的IP\n    char  user_name[1024] = \"root\";\t\t\t\t//用户名\n    char  user_password[1024] = \"123456\";\t\t///密码\t\t需要改为自己的密码\n    char  server_name[1024] = \"test\";\t\t\t///数据库名\t需要改为自己的数据库名\n    unsigned short host_port = 3306;\t\t\t//服务器端口\n\n    if(!mysql_real_connect(link_,host_name,user_name,user_password,server_name,host_port,NULL,0)) {\n        //失败处理\n        int error_code  =  mysql_errno(link_);            //获取错误码\n        //针对不同的错误码error_code，还应该做不同的处理\n        mysql_close(link_);                           //释放句柄\n        printf(\"链接建立失败! :%s\\n\",mysql_error(link_));\n    } else {\n        puts(\"链接建立成功\");\n        //链接建立成功，可以进行具体的操作(select   insert    delete   update  replace等）\n    }\n/// 例子2，可以和上面一个例子分开运行\n    puts(\"\\n测试2...(链接并查询)\");\n    char SqlText[256] = \"\";\n    MYSQL mysql;\n    MYSQL_RES *res = NULL;\n    MYSQL_FIELD * fd = NULL;\n    MYSQL_ROW row;\n    int i = 0;\n\n    mysql_init( &mysql );\n\n    if ( !mysql_real_connect( &mysql, \"localhost\", \"root\",\n                              \"123456\", \"test\", 3306, NULL, 0) ) {\n        puts(\"数据库连接失败\");\n        printf( \"Error connecting to database: %s\\n\",mysql_error(&mysql));\n        mysql_close( &mysql );\n        return FALSE;\n    } else {\n        puts(\"数据库连接成功\");\n        mysql_query(&mysql,\"set names 'GBK'\");//设置字符集，防止中文无法正常显示\n        sprintf( SqlText, \"insert into animals(name, kg) values ('chicken',6), ('dog', 4)\");\n        if ( !mysql_query(&mysql, SqlText ) ) {        //insert失败\n            printf(\"Can't insert data to table: \");\n            printf(\"%s\\n\", mysql_error(&mysql));\n            mysql_close( &mysql );\n            return FALSE;\n        }\n        sprintf( SqlText, \"select * from %s\",\"stu\");\t///stu需要改为自己的数据库中对应的表名\n        //进行数据检索\n        if ( !mysql_query(&mysql, SqlText )) {\n            res = mysql_store_result( &mysql );\n            i = (int)mysql_num_rows( res );\n            printf(\"Query: %s\\n%d records found:\\n\", SqlText, i );\n            //输出各字段名\n            for (; fd = mysql_fetch_field(res);)\n                printf(\"%-*s\\t\",50/mysql_num_fields(res), fd->name );\n            puts(\"\");\n\n            //打印获取的数据\n            MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示\n            while (row = mysql_fetch_row(res)) {    //获取下一行\n                for(int i=0; i<mysql_num_fields(res); i++)\n                    printf(\"%-*s\",80/mysql_num_fields(res),row[i]);\n                puts(\"\");\n            }\n            mysql_free_result( res );\n        } else {\n            printf(\"查询失败: %s\\n\",mysql_error(&mysql));\n            puts(\"请更改66行表名\");\n            mysql_close( &mysql );\n            return FALSE;\n        }\n    }\n    mysql_close(&mysql);\n    getchar();\n    return TRUE;\n}\n"
  },
  {
    "path": "职工管理系统C++.cpp",
    "content": "#include <windows.h>\n#include <mysql.h>\n#include <conio.h>  //getche(),getch()\n#include <iostream>\n#include <iomanip>\n#include <cstdio>\nusing namespace std;\n\nclass DB_worker {\npublic:\n    DB_worker(const char* tb = \"stu\");\n    ~DB_worker();\n    void showMenu();\n    void addRecord();\n    void deleteRecord();\n    void searchRecord();\n    void modifyRecord();\n    void sortRecord();\n    void showAllRecord(int saveToFile = 0);\nprivate:\n    bool executeQuery(const char*s = 0, int show = 1, const char* todo = \"select *\", int saveToFile = 0);\n    bool createConnection();\n    void printDateTime(FILE * fp);\nprivate:\n    char column[20][30]; //存储属性名称\n    FILE *fpLog;         //存储日志记录\n    char info[10][50];   //临时存放当前键入的属性值\n    MYSQL *conn;         //mysql连接\n    MYSQL_RES *res;      //这个结构代表返回的一个查询结果集\n    int num_fields;      //结果集中的列数\n    char query[1024];    //查询语句\n    char tableName[20];  //表名\n};\n\nint main()\n{\n    system(\"color fd\");\n    DB_worker workers(\"workers\");\n    workers.showAllRecord();\n    workers.showMenu();\n    return 0;\n}\n//构造函数中连接数据库\nDB_worker::DB_worker(const char*tb)\n{\n    fpLog = fopen(\"log.txt\", \"a+\");\n    strcpy(tableName, tb);\n    if (!createConnection()) {\n        cout << \"数据库连接失败,请检查连接后重试！\" << endl;\n        system(\"pause\");\n        exit(-1);\n    }\n}\n//释放连接和其他资源\nDB_worker::~DB_worker()\n{\n    mysql_free_result(res);\n    mysql_close(conn);\n    fclose(fpLog);\n}\n\nvoid DB_worker::showMenu()\n{\n    char c = 1;\n    while (c != '0') {\n        showAllRecord(1);\n        for (int j = 0; j < 65; j++)\n            cout << \"☆\";\n        cout << endl;\n        cout << \"\\t\\t\\t\\t\\t\\t\\t1.新增一名职工\\n\\t\\t\\t\\t\\t\\t\\t2.删除一名职工\\n\\t\\t\\t\\t\\t\\t\\t\"\n             \"3.查找\\n\\t\\t\\t\\t\\t\\t\\t4.修改\\n\\t\\t\\t\\t\\t\\t\\t5.排序\\n\\t\\t\\t\\t\\t\\t\\t\"\n             \"6.显示所有\\n\\t\\t\\t\\t\\t\\t\\t0.退出\" << endl;\n        for (int j = 0; j < 65; j++)\n            cout << \"☆\";\n        cout << endl;\n        cout << endl << \"请选择: \";\n        do {\n            c = getche();\n            cout << \"\\r\\t\\t\\t\\r\" << c << \":\";\n            switch (c) {\n                case '1':\n                    addRecord();\n                    break;\n                case '2':\n                    deleteRecord();\n                    break;\n                case '3':\n                    searchRecord();\n                    break;\n                case '4':\n                    modifyRecord();\n                    break;\n                case '5':\n                    sortRecord();\n                    break;\n                case '6':\n                    showAllRecord();\n                    break;\n                case '0':\n                    break;\n                default:\n                    cout << \"\\r输入错误，请重新输入:\";\n            }\n        } while (c < '0' || c > '6');\n        cout << endl;\n        fclose(fpLog);\n        fpLog = fopen(\"log.txt\", \"a+\");\n    }\n}\nvoid DB_worker::addRecord()\n{\n    sprintf(query, \"insert into %s values ('\", tableName);\n    cout << \"请输入 \" << column[0] << \": \";\n    cin >> info[0];\n    strcat(query, info[0]);\n    for (int i = 1; i < num_fields; i++) {\n        cout << \"请输入 \" << column[i] << \": \";\n        cin >> info[i];\n        strcat(query, \"','\");\n        strcat(query, info[i]);\n    }\n    strcat(query, \"')\");\n    printDateTime(fpLog);\n    if (mysql_query(conn, query)) {     //执行SQL语句\n        printf(\"添加失败 (%s)\\n\", mysql_error(conn));\n        fprintf(fpLog, \"Error: %s (%s)\\n\", query, mysql_error(conn));   //增加日志\n    } else {\n        puts(\"添加成功\");\n        fprintf(fpLog, \"%s\\n\", query);      //增加日志\n    }\n}\nvoid DB_worker::deleteRecord()\n{\n    char temp[128];\n    cout << \"请输入需要删除的\" << column[0] << \": \";\n    cin >> info[0];\n    sprintf(temp, \"where %s='%s'\", column[0], info[0]);\n    if (executeQuery(temp)) {     //执行SQL语句\n        cout << \"确定删除该元组？(1或y确认):\";\n        char c = getch();\n        if (c == '1' || c == 'y' || c == 'Y') {\n            printDateTime(fpLog);\n            if (executeQuery(temp, 1, \"delete\")) {\n                puts(\"删除成功\");\n                fprintf(fpLog, \"%s\\n\", query);      //增加日志\n            } else {\n                printf(\"删除失败 (%s)\\n\", mysql_error(conn));\n                fprintf(fpLog, \"Error: %s (%s)\\n\", query, mysql_error(conn));   //增加日志\n            }\n        } else\n            cout << \"已取消删除\" << endl;\n    } else {\n        printDateTime(fpLog);\n        puts(\"删除失败 (该元组不存在)\");\n        fprintf(fpLog, \"Error: %s : 该元组不存在\\n\", query);      //增加日志\n    }\n}\nvoid DB_worker::searchRecord()\n{\n    cout << \"请选择查找方式:\\n\";\n    for (int i = 0; i < num_fields; i++)\n        cout << i + 1 << \".\" << column[i] << \"  \";\n    char c = getch();\n    if (c > 48 && c < 49 + num_fields) {\n        cout << \"\\n请输入需要查找的\" << column[c - 49] << \": \";\n        cin >> info[0];\n        char temp[128];\n        sprintf(temp, \"where %s='%s'\", column[c - 49], info[0]);\n        executeQuery(temp);\n    }\n}\nvoid DB_worker::modifyRecord()\n{\n    cout << \"请选择需要修改元组的限制属性:\\n\";\n    for (int i = 0; i < num_fields; i++)\n        cout << i + 1 << \".\" << column[i] << \"  \";\n    char sel = getch();\n    char temp[128];\n    if (sel > 48 && sel < 49 + num_fields) {\n        cout << \"\\r\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r请输入限制元组的\" << column[sel - 49] << \": \";\n        cin >> info[0];\n        sprintf(temp, \"where %s='%s'\", column[sel - 49], info[0]);\n        if (executeQuery(temp)) {\n            cout << \"请选择需要修改的属性:\\n\";\n            for (int i = 0; i < num_fields; i++)\n                cout << i + 1 << \".\" << column[i] << \"  \";\n            sel = getch();\n            if (sel > 48 && sel < 49 + num_fields) {\n                cout << \"\\r\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r请输入新的\" << column[sel - 49] << \": \";\n                cin >> info[0];\n                sprintf(query, \"update %s set %s='%s' %s\", tableName,\n                        column[sel - 49], info[0], temp);\n                printDateTime(fpLog);\n                if (mysql_query(conn, query)) {     //执行SQL语句\n                    printf(\"修改失败 (%s)\\n\", mysql_error(conn));\n                    fprintf(fpLog, \"Error: %s (%s)\\n\", query, mysql_error(conn)); //增加日志\n                } else {\n                    puts(\"修改成功\");\n                    fprintf(fpLog, \"%s\\n\", query);  //增加日志\n                }\n            }\n        } else\n            cout << \"未搜索到可修改项，建议更改修改限制属性\" << endl;\n    }\n}\nvoid DB_worker::sortRecord()\n{\n    cout << \"请选择排序方式:\\n\";\n    for (int i = 0; i < num_fields; i++)\n        cout << i + 1 << \".\" << column[i] << \"  \";\n    char c = getch();\n    if (c > 48 && c < 49 + num_fields) {\n        char temp[128], way[5] = \"asc\";\n        cout << \"\\r\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\r以\" << column[c - 49]\n             << \"降序排序请按1或y,按q取消排序,其他键将按升序排序: \";\n        char c2 = getch();\n        cout << \"\\r\\t\\t\\t\\t\\t\\t\\t\\r按\" << column[c - 49];\n        if (c2 == 'q' || c2 == 'Q') {\n            cout << \"\\r\\t\\t\\t\\t\\t\\t\\t\\r已取消排序\" << endl;\n            return;\n        } else if (c2 == '1' || c2 == 'y' || c2 == 'Y') {\n            strcpy(way, \"desc\");\n            cout << \"降序排序\" << endl;\n        } else\n            cout << \"升序排序\" << endl;\n        sprintf(temp, \"order by %s %s\", column[c - 49], way);\n        if (executeQuery(temp)) {\n            printDateTime(fpLog);\n            fprintf(fpLog, \"%s\\n\", query);\n        }\n    }\n}\nvoid DB_worker::showAllRecord(int saveToFile)\n{\n    executeQuery(0, 1, \"select *\", saveToFile);\n}\n//连接数据库\nbool DB_worker::createConnection()\n{\n    int result = 1;\n    conn = mysql_init(0);  //初始化mysql，连接数据库\n    //此处密码字段可以根据具体环境修改参数\n    if (!mysql_real_connect(conn, \"localhost\", \"root\", \"123456\", \"test\", 0, NULL, 0)) {\n        printf( \"Error connecting to database:%s\\n\", mysql_error(conn));\n        result = 0;\n    } else {\n        printf(\"Connected successful\\n\");\n        int timeout =  2;      //设置查询超时时长\n        if (conn != NULL) {\n            //设置链接超时时间.\n            mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);\n            //设置查询数据库(select)超时时间\n            mysql_options(conn, MYSQL_OPT_READ_TIMEOUT, (const char *)&timeout);\n            //设置写数据库(update,delect,insert,replace等)的超时时间。\n            mysql_options(conn, MYSQL_OPT_WRITE_TIMEOUT, (const char *)&timeout);\n        }\n        mysql_query(conn, \"set names 'GBK'\"); //设置字符集，防止中文无法正常显示\n        //抽取表头信息并保存到column[]\n        sprintf(query, \"select * from %s \", tableName);\n        mysql_query(conn, query);\n        res = mysql_store_result(conn);\n        //必须对返回的指针进行校验，否则如果没有这个表，会导致程序崩溃！！\n        //必须养成校验返回值的习惯，特别是对返回的是指针的情况\n        if (res != NULL) {\n            num_fields = mysql_num_fields(res);\n            //获取各字段的表头名称\n            for (int i = 0; i < num_fields; i++)\n                strcpy(column[i], mysql_fetch_field(res)->name);\n            puts(\"\");\n        }\n    }\n    puts(\"————————————————————\\n\");\n    return result;\n}\n//建立查询\nbool DB_worker::executeQuery(const char*s, int show, const char* todo, int saveToFile)\n{\n    sprintf(query, \"%s from %s \", todo, tableName);\n    if (s != NULL && s[0] != '\\0') // 连接上条件语句\n        strcat(query, s);\n    if (mysql_query(conn, query)) {     //执行SQL语句\n        printf(\"Query failed (%s)\\n\", mysql_error(conn));\n        return 0;\n    } else if (strcmp(todo, \"delete\") == 0)\n        return 1;\n    //获取结果集\n    if (!(res = mysql_store_result(conn))) { //获得sql语句结束后返回的结果集\n        printf(\"Couldn't get result from %s\\n\", mysql_error(conn));\n        return 0;\n    }\n    //打印结果数\n    int affect = mysql_affected_rows(conn);\n    if (show) {\n        if (!saveToFile)\n            printf(\">>>职工表中————共查询到 %d 组结果<<<\\n\", affect);\n        //获取字段的信息\n        if (affect > 0) {\n            if (saveToFile)\n                freopen(\"data.txt\", \"w\", stdout);\n            for (int i = 0; i < num_fields; i++)\n                printf(\"%-*s\", 130 / num_fields, column[i]);\n            puts(\"\");\n            //打印获取的数据\n            MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示\n            while (row = mysql_fetch_row(res)) {    //获取下一行\n                for (int i = 0; i < num_fields; i++)\n                    printf(\"%-*s\", 130 / num_fields, row[i]);\n                puts(\"\");\n            }\n            if (saveToFile) {\n                freopen(\"CON\", \"w\", stdout);\n                return true;\n            }\n        }\n    }\n    puts(\"————————————————————\\n\");\n    return affect;\n}\n//在日志文件中打印当前日期和时间\nvoid DB_worker::printDateTime(FILE * fp)\n{\n    time_t now_time = time(NULL);\n    struct tm *newtime = localtime(&now_time);\n    char tmpbuf[128];\n    static int first = 1;\n    if (first) {\n        strftime(tmpbuf, 128, \"\\n******%Y/%m/%d******\\n\", newtime);\n        fprintf(fp, tmpbuf);\n        first = 0;\n    }\n    strftime(tmpbuf, 128, \"%H:%M:%S    \", newtime);\n    fprintf(fp, tmpbuf);\n}\n"
  },
  {
    "path": "职工管理系统C.cpp",
    "content": "#include <windows.h>\n#include <iostream>\n#include <mysql.h>\n#include <iomanip>\n#include <cstring>\n#include <conio.h>\n#include <cstdio>\n#include <ctime>\nusing namespace std;\nchar column[20][30];\t//洢\nFILE *fplog;\nchar info[10][50];\t\t//ʱŵǰֵ\nMYSQL mysql, *sock;\t\t//mysql\nMYSQL_RES *res;\t\t\t//ṹеһѯ\nint num_fields;\t\t\t//е\nchar query[1024];\t\t//ѯ\nchar tableName[20];\t\t//\n\nbool QueryDatabase(const char*s=0,int show=1,const char* todo=\"select * \");\nbool ConnectDatabase();\nvoid printDateTime(FILE * fp);\nvoid DB(const char* tb = \"worker\");\nvoid close();\nvoid Choose();\nvoid Add();\nvoid Delete();\nvoid Search();\nvoid Modify();\nvoid Sort();\nvoid ShowAll();\n\nint main() {\n\tDB(\"workers\");\n    ShowAll();\n    Choose();\n    close();\n    return 0;\n}\n\nvoid Choose() {\n    char c;\n    while(c!='0') {\n        cout<<setfill('*')<<setw(80)<<\"*\"<<endl;\n        cout<<\"1.\\n2.ɾ\\n3.\\n4.޸\\n5.\\n6.ʾ\\n0.˳\"<<endl;\n        cout<<setfill('*')<<setw(80)<<\"*\"<<endl<<\"ѡ: \";\n        do {\n            c=getche();\n            cout<<\"\\r\\t\\t\\t\\r\"<<c<<\":\";\n            switch(c) {\n            case '1':\n                Add();\n                break;\n            case '2':\n                Delete();\n                break;\n            case '3':\n                Search();\n                break;\n            case '4':\n                Modify();\n                break;\n            case '5':\n                Sort();\n                break;\n            case '6':\n                ShowAll();\n                break;\n            case '0':\n                break;\n            default:\n                cout<<\"\\r:  \\b\\b\";\n            }\n        } while(c<'0' || c>'6');\n        cout<<endl;\n        fclose(fplog);\n        fplog = fopen(\"log.txt\",\"a+\");\n    }\n}\n\nvoid Add() {\n    sprintf(query, \"insert into %s values ('\",tableName);\n    cout<<\" \"<<column[0]<<\": \";\n    cin>>info[0];\n    strcat(query,info[0]);\n    for(int i=1; i<num_fields; i++) {\n        cout<<\" \"<<column[i]<<\": \";\n        cin>>info[i];\n        strcat(query,\"','\");\n        strcat(query,info[i]);\n    }\n    strcat(query,\"')\");\n    printDateTime(fplog);\n    if(mysql_query(sock, query)) {      //ִSQL\n        printf(\"ʧ (%s)\\n\",mysql_error(sock));\n        fprintf(fplog,\"Error: %s (%s)\\n\",query,mysql_error(sock));\t\t//־\n    } else {\n        puts(\"ӳɹ\");\n        fprintf(fplog,\"%s\\n\",query);\t\t//־\n    }\n}\nvoid Delete() {\n    char temp[128];\n    cout<<\"Ҫɾ\"<<column[0]<<\": \";\n    cin>>info[0];\n    sprintf(temp,\"where %s='%s'\",column[0],info[0]);\n    if(QueryDatabase(temp)) {      //ִSQL\n        cout<<\"ȷɾԪ飿(1yȷ):\";\n        char c=getch();\n        if(c=='1' || c=='y' || c=='Y') {\n            printDateTime(fplog);\n            if(QueryDatabase(temp,1,\"delete\")) {\n                puts(\"ɾɹ\");\n                fprintf(fplog,\"%s\\n\",query);\t\t//־\n            } else {\n                printf(\"ɾʧ (%s)\\n\",mysql_error(sock));\n                fprintf(fplog,\"Error: %s (%s)\\n\",query,mysql_error(sock));\t\t//־\n            }\n        } else\n            cout<<\"ȡɾ\"<<endl;\n    } else {\n        printDateTime(fplog);\n        puts(\"ɾʧ (Ԫ鲻)\");\n        fprintf(fplog,\"Error: %s : Ԫ鲻\\n\",query);\t\t//־\n    }\n}\nvoid Search() {\n    cout<<\"ѡҷʽ:\\n\";\n    for(int i=0; i<num_fields; i++)\n        cout<<i+1<<\".\"<<column[i]<<\"  \";\n    char c=getch();\n    if(c>48 && c<49+num_fields) {\n        cout<<\"\\nҪҵ\"<<column[c-49]<<\": \";\n        cin>>info[0];\n        char temp[128];\n        sprintf(temp,\"where %s='\",column[c-49]);\n        strcat(temp,info[0]);\n        strcat(temp,\"'\");\n        QueryDatabase(temp);\n    }\n}\nvoid Modify() {\n    cout<<\"ѡҪ޸ĵ:\\n\";\n    for(int i=0; i<num_fields; i++)\n        cout<<i+1<<\".\"<<column[i]<<\"  \";\n    char c=getch();\n    char temp[128];\n    if(c>48 && c<49+num_fields) {\n        cout<<\"\\nԵ\"<<column[c-49]<<\": \";\n        cin>>info[0];\n        sprintf(temp,\"where %s='%s'\",column[c-49],info[0]);\n        if(QueryDatabase(temp)) {\n            cout<<\"ѡҪ޸ĵ:\\n\";\n            for(int i=0; i<num_fields; i++)\n                cout<<i+1<<\".\"<<column[i]<<\"    \";\n            char c=getch();\n            if(c>48 && c<49+num_fields) {\n                cout<<\"\\nµ\"<<column[c-49]<<\": \";\n                cin>>info[0];\n                sprintf(query, \"update %s set %s='%s' %s\",tableName,column[c-49],info[0],temp);\n                printDateTime(fplog);\n                if(mysql_query(sock, query)) {      //ִSQL\n                    printf(\"޸ʧ (%s)\\n\",mysql_error(sock));\n                    fprintf(fplog,\"Error: %s (%s)\\n\",query,mysql_error(sock));\t//־\n                } else {\n                    puts(\"޸ĳɹ\");\n                    fprintf(fplog,\"%s\\n\",query);\t//־\n                }\n            }\n        } else\n            cout<<\"δ޸޸\"<<endl;\n    }\n}\nvoid Sort() {\n    cout<<\"ѡʽ:\\n\";\n    for(int i=0; i<num_fields; i++)\n        cout<<i+1<<\".\"<<column[i]<<\"  \";\n    char c=getch();\n    if(c>48 && c<49+num_fields) {\n        char temp[128], way[5]=\"asc\";\n        cout<<\"\\r\"<<column[c-49]<<\"밴1y,qȡ,: \";\n        char c2=getch();\n        cout<<\"\\r\\t\\t\\t\\t\\t\\t\\t\\r\"<<column[c-49];\n        if(c2=='q' || c2=='Q') {\n            cout<<\"\\r\\t\\t\\t\\t\\t\\t\\t\\rȡ\"<<endl;\n            return;\n        } else if(c2=='1' || c2=='y' || c2=='Y') {\n            strcpy(way,\"desc\");\n            cout<<\"\"<<endl;\n        } else\n            cout<<\"\"<<endl;\n        sprintf(temp,\"order by %s %s\",column[c-49],way);\n        if(QueryDatabase(temp)) {\n            printDateTime(fplog);\n            fprintf(fplog,\"%s\\n\",query);\n        }\n    }\n}\nvoid ShowAll() {\n    QueryDatabase();\n}\n//ݿ\nbool ConnectDatabase() {\n    int result = 1;\n    mysql_init(&mysql);  //ʼmysqlݿ\n    if (!(sock = mysql_real_connect(&mysql,\"localhost\", \"root\", 0, \"test\",0,NULL,0))) {\n        printf( \"Error connecting to database:%s\\n\",mysql_error(&mysql));\n        result = 0;\n    } else {\n        printf(\"Connected successful\\n\");\n        mysql_query(sock,\"set names 'GBK'\");//ַֹ޷ʾ\n        sprintf(query, \"select * from %s \",tableName);\n        mysql_query(sock, query);\n        res = mysql_store_result(sock);\n        num_fields = mysql_num_fields(res);\n        //ȡֶεϢ\n        for(int i=0; i<num_fields; i++)\n            strcpy(column[i], mysql_fetch_field(res)->name);\n        puts(\"\");\n    }\n    puts(\"\\n\");\n    return result;\n}\n\n//ѯ\nbool QueryDatabase(const char*s,int show,const char* todo) {\n    int result = 1;\n    sprintf(query, \"%s from %s \",todo,tableName);\n    if(s)\n        strcat(query,s);\n    if(mysql_query(sock, query)) {      //ִSQL\n        printf(\"Query failed (%s)\\n\",mysql_error(sock));\n        return 0;\n    } else if(strcmp(todo,\"delete\")==0)\n        return 1;\n    //ȡ\n    if (!(res=mysql_store_result(sock))) {  //sql󷵻صĽ\n        printf(\"Couldn't get result from %s\\n\", mysql_error(sock));\n        return 0;\n    }\n    //ӡ\n    int affect = mysql_affected_rows(sock);\n    if(show) {\n        printf(\">>>ѯ %d <<<\\n\",affect);\n        //ȡֶεϢ\n        if(affect>0) {\n            for(int i=0; i<num_fields; i++)\n                printf(\"%-*s\",80/num_fields,column[i]);\n            puts(\"\");\n            //ӡȡ\n            MYSQL_ROW row; //һݵͰȫ(type-safe)ıʾ\n            while (row = mysql_fetch_row(res)) {    //ȡһ\n                for(int i=0; i<num_fields; i++)\n                    printf(\"%-*s\",80/num_fields,row[i]);\n                puts(\"\");\n            }\n        }\n    }\n    puts(\"\\n\");\n    return affect;\n}\n\nvoid printDateTime(FILE * fp) {\n    time_t now_time=time(NULL);\n    struct tm *newtime=localtime(&now_time);\n    char tmpbuf[128];\n    static int first = 1;\n    if(first) {\n        strftime(tmpbuf,128,\"\\n******%Y/%m/%d******\\n\",newtime);\n        fprintf(fp,tmpbuf);\n        first = 0;\n    }\n    strftime(tmpbuf,128,\"%H:%M:%S    \",newtime);\n    fprintf(fp,tmpbuf);\n}\n\nvoid DB(const char*tb) {\n    fplog = fopen(\"log.txt\",\"a+\");\n    strcpy(tableName,tb);\n    if(!ConnectDatabase()) {\n        cout<<\"ݿʧ,Ӻԣ\"<<endl;\n        system(\"pause\");\n        exit(-1);\n    }\n}\n//ͷԴ\nvoid close() {\n    mysql_free_result(res);\n    mysql_close(sock);\n    fclose(fplog);\n}\n"
  }
]