MySQL 数据库应用程序编程
普通用户使用客户端应用程序(Client Application)和服务器程序(Server Application)通信以取得服务, 而服务器程序通常要和数据库服务器通信以取得数据存取服务, 这时就需要使用到使用到数据库连接技术, 我本人将使用数据库连接技术编程, 称为数据库应用程序编程, 更多时候的数据库应用程序编程依赖数据库发行商提供的驱动程序或接口模块.
MySQL 为程序员提供了多种编程语言的接口, 如使用 C 语言编程, 则可以下载 MySQL Connector C 套件, 解压后得到 include 目录下的头文件, 和 lib 目录下的共态链接库 libmysql.dll, 该动态链接库 的导入库libmysql.lib, 以及静态对象库 mysqlclient.lib, 显然, 使用动态链接库的编译速度更快.
关于这些 API 的使用方法, 请参考官方文档, 下面是一个演示.
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <assert.h>
#include <C:\Program Files\MySQL\MySQL Connector C 6.1\include\mysql.h> #pragma comment(lib, "C:\\Program Files\\MySQL\\MySQL Connector C 6.1\\lib\\libmysql.lib") void Todo(MYSQL *mysql) { const char *a = mysql_stat(mysql);
printf("数据库连接状态:\n"
"%s\n", a); // 创建一个数据库
char cmd[];
sprintf(cmd, "CREATE DATABASE `my_test_db`"); if (mysql_query(mysql, cmd) != EXIT_SUCCESS) {
printf("创建失败!\n"
"%d: %s\n", mysql_errno(mysql), mysql_error(mysql));
} else {
printf("创建成功!\n");
} // 选择数据库
sprintf(cmd, "USE `my_test_db`");
if (mysql_query(mysql, cmd) != EXIT_SUCCESS) {
printf("选择失败!\n"
"%d: %s\n", mysql_errno(mysql), mysql_error(mysql));
return ;
} else {
printf("选择了表!\n");
} // 创建表
sprintf(cmd, "CREATE TABLE `t`("
"ID INT NOT NULL AUTO_INCREMENT,"
"Name VARCHAR(20) NOT NULL,"
"PRIMARY KEY(ID)"
")");
if (mysql_query(mysql, cmd) != EXIT_SUCCESS) {
printf("创建失败!\n"
"%d: %s\n", mysql_errno(mysql), mysql_error(mysql));
} // 查看表型
sprintf(cmd, "DESC `t`");
if (mysql_query(mysql, cmd) != EXIT_SUCCESS) { printf("查看失败!\n"
"%d: %s\n", mysql_errno(mysql), mysql_error(mysql)); } else { // 取结果集
MYSQL_RES *res;
res = mysql_store_result(mysql); if (res == NULL) {
printf("查询没有返回结果\n");
} else { int fc = mysql_field_count(mysql);
printf("字段数量: %u.\n", fc);
// 一行一行地取结果
MYSQL_ROW row;
while (row = mysql_fetch_row(res)) {
int i = ;
for (; i < fc; i++) {
printf("|%s\t", row[i] != NULL ? row[i] : "NULL");
}
printf("\n");
}
}
}
} void Test() { // 初始化 MySQL 客户端模块
assert(mysql_library_init(, NULL, NULL) == EXIT_SUCCESS); // 获取数据库描述符
MYSQL *mysql = NULL;
mysql = mysql_init(mysql);
// 连接数据库
if (mysql_real_connect(mysql, "localhost", "root", "passwd", NULL, , NULL, ) == NULL) {
printf("连接失败!\n");
printf("%d: %s\n", mysql_errno(mysql), mysql_error(mysql));
} // 你想用数据库做些什么事情?
Todo(mysql); // 关闭数据库连接
mysql != ? mysql_close(mysql) : ;
// 释放模块
mysql_library_end();
} int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpszCmdLine, int iCmdShow) { // 分配控制台
AllocConsole(); //
Test(); printf("\n"
"The end.\n"); // 消息循环
MSG msg;
while (GetMessage(&msg, NULL, , ) > ) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return EXIT_SUCCESS;
}
第一次运行:

再次运行:

MySQL 数据库应用程序编程的更多相关文章
- 第十三章.MySQL数据库与JDBC编程(下)
JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: publi ...
- MySql数据库与JDBC编程二
DML语法语句:主要操作数据表中的数据,完成插入新数据,修改已有数据,删除不要的数据的任务 1,insert into 语句 用于向指定表插入数据,一次只能插入一条记录:insert into tab ...
- MySql数据库与JDBC编程
JDBC -- Java Database Connectivity,即Java数据库连接,通过使用JDBC就可以使用同一种API访问不同的数据库 SQL语句基础(SQL结构化查询语言) 能完成的任务 ...
- 批量备份mysql数据库(shell编程)
#!/bin/bash DBPATH=/mysqlbak MYUSER=root MYPASS= SOCKET=/var/lib/mysql/mysql.sock MYCMD="mysql ...
- MySql数据库与JDBC编程三
多表连接查询(两种规范 SQL92和SQL99) SQL92规范: 等值连接,非等值连接,外连接,广义笛卡儿积连接 多个表都放在from后,,连接条件放在where后,条件要求两列值相等,则为等值连接 ...
- 项目--解决MySQL数据库插入中文乱码
转载自:http://blog.csdn.net/zzh920625/article/details/51226312 情景再现] 如图,在项目中使用MySQL数据库,在做插入操作时,写入英文字符没有 ...
- MySQL数据库服务器的架设
导读 MySQL数据库是Linux操作系统上用得最多的数据库系统,它可以非常方便的与其它服务器集成在一起,如Apache.Vsftpd.Postfix等.下面介绍RHEL 6平台MySQL数据库服务器 ...
- 沃森Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...
- 在控制台使用MySQL数据库
本篇内容介绍的是如何在控制台下使用MySQL数据库.首先需要安装MySQL数据库应用程序,然后找到MySql的Command Line Client进入之后你会看到,此处需要正确输入密码,否则会直接退 ...
随机推荐
- 【Luogu4781】【模板】拉格朗日插值
[Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...
- 【BZOJ2870】最长道路(边分治)
[BZOJ2870]最长道路(边分治) 题面 BZOJ权限题 Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样 ...
- [CF1132E]Knapsack【暴力搜索】
你有一个容量为\(w\)的背包,和\(8\)件物品,重量分别为\(1~8\)的整数,分别有\(cnt_1 ... cnt_8\),求最大容量. 解法 笨蛋chh一开始打了一个背包模板乱搞压缩容量\(j ...
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
- uvaLive7303 Aquarium (kruskal)
题意:给R*C的房间,每个房间被左上-右下或右上-左下的墙分割为两个小房间,将分割移除有一定花费,问使所有小房间联通需要的最小花费 把每个房间分成左右(上下?)两个点,判一判,本来就联通的加零边,一个 ...
- list根据某个字段去重
方法一:使用Set List<User> newList = new ArrayList<User>(); Set<String> set = new HashSe ...
- C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件
前两天的时候学习了winfrom,简单地说就是各种布局,然后给按钮,textbox等各种控件添加各种事件的操作,经过前天一晚上,昨天一天的练习操作的还算熟练,但是对构造函数传值还是不是很了解,由于各种 ...
- JDK和CGLIB动态代理区别
背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结. 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/de ...
- SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...
- Nginx快捷启动配置
Linux下Nginx开关服务,正常方式是这样({nginx}-为Nginx安装路径): {nginx}/sbin/nginx #启动 {nginx}/sbin/nginx -s stop #停止 这 ...