接下来,我们要学习编写一个错误处理函数。咱们的代码中都是通过检查调用的 MySQL 库函数的返回值来判断函数调用是否成功。返回指针的函数调用,判断返回值是否是一个空指针(NULL);返回整数值的函数调用,判断返回值是否是一个非零值。错误发生时,咱们只是调用 C 函数 fprint( ) 来向用户显示一行咱们自己定义的错误信息。其实 MySQL 库为咱们提供了三个函数调用,提供给我们更多 MySQL 特定的、更加具体的错误信息。这三个函数是:
mysql_error() :返回包含错误信息的字符串。
mysql_errno() :返回 MySQL 特定的错误代码。
mysql_sqlstate() :返回一个 SQLSTATE 代码。一个 SQLSTATE 值更加中立一些,因为它是基于 ANSL SQL 和 ODBC 标准,不是和特定的 SQL 数据库实现(比如 MySQL 数据库)相关。
以下是咱们要编写的错误报告函数:
static void
print_error(MYSQL *conn, char *message)
{
fprintf(stderr, "%s\n", message);
if (conn != NULL)
{
fprintf(stderr, "Error %u (%s): %s\n",
mysql_errno(conn), mysql_sqlstate(conn), mysql_error(conn));
}
}
以下是用 print_error ( ) 代替调用 fprintf () 后的代码:
// exec_stmt.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include // 这个头文件必须是第一个被包含的文件
#include
#include
#include
#include // 需要的函数strdup()在这个头文件中声明
static char *opt_host_name = NULL; // 服务器主机 (默认=localhost)
static char *opt_user_name = "sampadm"; // 用户名 (默认=登陆名)
static char *opt_password = "secret"; // 密码 (默认=无)
static unsigned int opt_port_num = 0; // 端口号(使用内置值)
static char *opt_socket_name = NULL; // 套接字名称 (使用内置值)
static char *opt_db_name = "sampdb"; // 数据库名称(默认=无)
static unsigned int opt_flags = 0; // 连接标志connection flags (无)
static int ask_password = 0; // 是否请求密码
static MYSQL *conn; // 连接数据库句柄的指针
// ***** 函数声明 *****
static void print_error(MYSQL *conn, char *message);
// ********************
static void
print_error(MYSQL *conn, char *message)
{
fprintf(stderr, "%s\n", message);
if (conn != NULL)
{
fprintf(stderr, "Error %u (%s): %s\n",
mysql_errno(conn), mysql_sqlstate(conn), mysql_error(conn));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
// 将一个全局变量指向程序的名称并调用my_init()。
// 这个全局变量会被MySQL库用于错误信息中。
// MY_INIT (argv[0]);
// 执行一些设置操作
my_init();
// 初始化客户端库
if (mysql_library_init(0, NULL, NULL))
{
print_error(NULL, "mysql_library_init() falied");
exit(1);
}
// 初始化连接句柄
conn = mysql_init(NULL);
if (conn == NULL)
{
print_error(NULL, "mysql_init() failed (probably out of memory)");
exit(1);
}
// 连接到服务器
if (mysql_real_connect(conn,
opt_host_name,
opt_user_name,
opt_password,
opt_db_name,
opt_port_num,
opt_socket_name,
opt_flags) == NULL)
{
print_error(conn, "mysql_real_connect() failed");
mysql_close(conn);
exit(1);
}
// ... 在这里发出查询语句并处理返回的结果 ...
// 断开与服务器的连接
mysql_close(conn);
// 停止客户端库
mysql_library_end();
return 0;
}
光明兄弟