c 连接mysql错误信息_使用C语言访问MySQL数据 —— 连接和错误处理

2011-05-09 wcdj

可以通过许多不同的编程语言来访问MySQL,例如,C,C++,Java,Perl,Python,Tcl,PHP等。本文主要总结使用C语言接口如何访问MySQL数据。

(一) 连接例程

(二) 错误处理

(一) 连接例程

用C语言连接MySQL数据库包含两个步骤:

(1) 初始化一个连接句柄结构。使用mysql_init 来初始化连接句柄。

(2) 实际进行连接。使用mysql_real_connect来向一个连接提供参数。

其余步骤:

(3) 使用完连接之后,使用 mysql_close 关闭连接。

(4) mysql_options用于设置选项。注意:仅能在 mysql_init 和 mysql_real_connect 之间调用。mysql_options 一次只能设置一个选项,所以每设置一个选项就得调用它一次。

具体过程如下:

登录mysql

$ mysql -u root -p

输入密码

创建一个本地用户wcdj

mysql> GRANT ALL ON *.* TO wcdj@localhost IDENTIFIED BY 'secretpassword';   (注意:最后的分号)

退出root用户

mysql> /q

Bye

登录新创建的用户wcdj

$ mysql -u wcdj --password=secretpassword

创建一个新的数据库newdatabase

mysql> CREATE DATABASE newdatabase;

退出wcdj用户

mysql> /q

编写create_children.sql 文件,用于创建表和添加数据。

--

-- Create the table children

--

CREATE TABLE children (

childno int(11) NOT NULL auto_increment,

fname varchar(30),

age int(11),

PRIMARY KEY (childno)

);

--

-- Populate the table 'children'

--

INSERT INTO children(childno, fname, age) VALUES (1, 'wcdj', 21);

INSERT INTO children(childno, fname, age) VALUES (2, 'gerry', 22);

INSERT INTO children(childno, fname, age) VALUES (3, 'echo', 23);

登录mysql

$ mysql -u wcdj --password=secretpassword newdatabase   (注意,后面的newdatabase用于指定使用的数据库)

在新的数据库newdatabase中创建表children并添加数据:

mysql> /. create_children.sql

查看新添加的数据:

SELECT * from children;

1   wcdj    21

2   gerry   22

3   echo    23

connect1.c

#include 

#include 

#include "mysql.h"

intmain()

{

MYSQL *conn_ptr;

conn_ptr = mysql_init(NULL);

if(!conn_ptr)

{

fprintf(stderr, "mysql_init failed/n");

returnEXIT_FAILURE;

}

conn_ptr = mysql_real_connect(conn_ptr, "localhost","wcdj","123","newdatabase", 0, NULL, 0);

if(conn_ptr)

{

printf("Connection success/n");

}

else

{

printf("Connection failed/n");

}

mysql_close(conn_ptr);

returnEXIT_SUCCESS;

}

编译程序:

$ gcc -I/usr/include/mysql connect1.c -L/usr/lib/mysql -lmysqlclient -o connet1

测试:

$ ./connect1

Connection success

$

(二) 错误处理

(1) unsigned int mysql_errno(MYSQL *connection);    (错误码)

(2) char *mysql_error(MYSQL *connection);        (文本错误信息)

可以通过调用 mysql_errno 并传递连接结构来获得错误码,它通常都是非0值。如果未设定错误码,它将返回0。

注意:因为每次调用库都会更新错误码,所以你只能得到最后一个执行命令的错误码。但是,上面列出的两个错误检查例程是例外,它们不会导致错误码的更新。

也可以调用 mysql_error ,来提供有意义的文本信息而不是单调的错误码。这些信息被写入一些内部静态内存空间中,所以如果想保存错误文本,你需要把它复制到别的地方。

注意:当调用 mysql_real_connect 时会遇到一个问题,因为它在失败时返回NULL指针,并没有提供一个错误码。但如果你将连接句柄作为一个变量,那么即使 mysql_real_connect 失败,你仍然能够处理它。

connect2.c

使用非动态分配的连接结构,以及编写一些基本的错误处理代码。

#include 

#include 

#include "mysql.h"

intmain()

{

MYSQL my_connection;

mysql_init(&my_connection);

if(mysql_real_connect(&my_connection,"localhost","wcdj","123","newdatabase", 0, NULL, 0))

{

printf("Connection success/n");

mysql_close(&my_connection);

}

else

{

fprintf(stderr, "Connection failed/n");

if(mysql_errno(&my_connection))

{

fprintf(stderr, "Connection error %d: %s/n", mysql_errno(&my_connection),

mysql_error(&my_connection));

}

}

returnEXIT_SUCCESS;

}

编译程序:

$ gcc -I/usr/include/mysql connect2.c -L/usr/lib/mysql -lmysqlclient -o connet2

假设当前没有创建 newdatabase 这个数据库,运行 connect2 将提示如下错误信息:

测试:

$ ./connect2

Connection failed

Connection error 1049: Unknown database 'newdatabase'

登录mysql

$ mysql -u wcdj --password=123

创建一个新的数据库newdatabase

mysql> CREATE DATABASE newdatabase;

退出wcdj用户

mysql> /q

再此测试 connect2:

Connection success

修改 connect2.c 中的密码 123 为一个错误的密码,再测试会提示如下错误信息:

Connection failed

Connection error 1045: Access denied for user 'wcdj'@'localhost' (usig password: YES)

参考:

Linux 程序设计(第4版)第8章 P.283

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse编写wordcount提交spark运行

采用集成了scala的eclipse编写代码 代码: package wordcountimport org.apache.spark.SparkConf import org.apache.spark.SparkContextobject WordCount {def main(args: Array[String]): Unit {//非常重要,是通向Spark集群的入口val confnew SparkCon…

gitlab 删除分支_如何删除gitlab上默认受保护的master主分支

今天开发在检查代码的时候,发现master分支有问题,现在准备删除此主分支,并且重新提交正确的代码,不过在删除时发现,master分支不能被删除。ps:主分支一般都是线上分支,需要开发确认后并且做好备…

rsync服务扩展应用

rsync服务扩展应用① 守护进程多模块功能配置第一步:修改配置文件 注:可以再vim中输入:20,22copy22,表示复制20到22行到22行之后 vim /etc/rsyncd.conf[backup01]comment "backup dir by oldboy"path /backup[backup0…

NodeJs 安装

进入官网下载,zip 安装包 https://nodejs.org/en/download/ 解压 配置环境变量到安装目录 cmd 测试 node -v npm -v

SSH秘钥登录服务器

一、查看本机 ssh 公钥,生成公钥 1.通过命令窗口 a. 打开你的 git bash 窗口 b. 进入 .ssh 目录:cd ~/.ssh c. 找到 id_rsa.pub 文件:ls d. 查看公钥:cat id_rsa.pub 或者 vim id_rsa.pub git–查看本机 ssh 公钥&#xff0c…

mysql存入mtr数据_mysql mtr写入数据

selenium 打开浏览器import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebE ...Win8.1安装Visual Studio 2015提示需要KB2919355http://www.microsoft.com/zh-cn/download/details.aspx?id42335 安装说明: 1.若要…

diff git 代码实现_Git 自救指南:这些坑你都跳得出吗?

每天都会写架构师文章,Java技术文章天天更新,感兴趣的点个关注再走呗!Git 虽然因其分布式管理方式,不完全依赖网络,良好的分支策略,容易部署等优点,已经成为最受欢迎的源代码管理方式。但是一分…

HDU 4812 D Tree

HDU 4812 思路&#xff1a; 点分治 先预处理好1e6 3以内到逆元 然后用map 映射以分治点为起点的链的值a 成他的下标 u 然后暴力跑出以分治点儿子为起点的链的值b&#xff0c;然后在map里查找inv[b]*k 代码&#xff1a; #include<bits/stdc.h> using namespace std; #d…

Angular CLI 安装

安装Angular 官网的教程&#xff0c;因为国内网络环境原因&#xff0c;访问不了服务器&#xff0c;导致安装失败。 1、先安装NodeJs 安装教程&#xff1a;http://blog.csdn.net/zengmingen/article/details/72650484 2、通过NodeJs中的模块npm 命令行安装 CLI 2.1、设置npm的…

go 写文件_「go」 项目多个文件编程

golang 学习的时候很多sample 讲的都是一个文件的go 文件怎么写&#xff0c;但是现实中不可能所有的实现都写到一个文件里面&#xff0c;按照功能的不同&#xff0c;要么拆分成不同的文件&#xff0c;要么拆分成不同的文件。下面有些个人的经验分享下&#xff0c;如果有问题请指…

CycleGAN 各种变变变

转载自 简单介绍了一下GAN和DCGAN的原理。以及如何使用Tensorflow做一个简单的生成图片的demo。 Ian Goodfellow对GAN一系列工作总结的ppt&#xff0c;确实精彩&#xff0c;推荐&#xff1a;独家 | GAN之父NIPS 2016演讲现场直击&#xff1a;全方位解读生成对抗网络的原理及未来…

pycharm与webstorm 2017 激活破解

原有的方式已经失效&#xff0c;见下面博文&#xff1a; https://blog.csdn.net/justszh/article/details/81484802

mysql blob 比较_与MSSQL对比学习MYSQL的心得(四)--BLOB数据类型

MYSQL里的BLOB数据类型BLOB是一个二进制大对象&#xff0c;用来存储可变数量的数据。BLOB类型分为4种&#xff1a;TinyBlob、Blob、MediumBlob、LongBlob&#xff0c;这几个类型之间的唯一区别是在存储文件的最大大小上不同。MySQL的四种BLOB类型 类型 大小(单位&#xff1…

Webstorm常用快捷键

webstrom 使用 eclipse快键键 File--settings keymap 选择 eclipse 原文链接&#xff1a;http://www.cnblogs.com/yeminglong/p/5995421.html ------------------以下是webstrom默认的----------------------------------- Ctrl/ 或 CtrlShift/ 注释&#xff08;// 或者/…

VirtualBox 上安装Debian 后分辨率设置

VirtualBox 上安装Debian 后分辨率设置 首先要配置source.list打开终端&#xff0c; su 切换成root用户&#xff0c; cd /etc/apt 然后编辑source.list rootdebian:/etc/apt# vi source.list 注释deb cdrom:行&#xff0c;加以下源 deb http://deb.debian.org/debian stretc…

疯狂的程序员_程序员的乐趣是什么?

作者&#xff1a;Java3y我是一个程序员&#xff0c;外行人都以为我是修电脑的&#xff0c;我笑了笑&#xff0c;随意ctrl cctrl v了一把&#xff0c;想象着你们因为我的文章而开心不止&#xff0c;我感到充实而欣慰。想象着你们给我拼命点赞的样子&#xff0c;是多么的滑稽&…

template多行编写的方式

模板是包在 ECMAScript 2015 反引号 () 中的一个多行字符串。 反引号 () — 注意&#xff0c;不是单引号 () — 允许把一个字符串写在多行上&#xff0c; 使 HTML 模板更容易阅读。 反引号&#xff1a;键盘数字键1 旁边的&#xff0c;ESC键下面的键 如果单引号 Component({sel…

sqllite事务和MySQL事务_Android学习---SQLite数据库的增删改查和事务(transaction)调用...

上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句.首先,创建一个新的android项目:其次,查看代码实现增删查改:1.创建DB工具类MyDBHelper.java(创建数据库的操作)packagecom.amos.android_db;impo…

sqlserver2000给账户授予所有的权限_你的位置信息权限设置对了么?

位置信息权限是众多应用权限中的一种&#xff0c;是应用获取手机地理位置信息的必要凭证。在你首次安装应用并打开时&#xff0c;通常会出现一连串的权限弹框&#xff0c;如果该应用在其运行过程中会用到你的地理位置信息&#xff0c;那么这些弹框中就会包含一个与位置信息有关…

Python之路,Day1 - Python基础1

本节内容 Python介绍发展史Python 2 or 3?安装Hello World程序变量用户输入模块初识.pyc是个什么鬼&#xff1f;数据类型初识数据运算表达式if ...else语句表达式for 循环break and continue 表达式while 循环作业需求 一、 Python介绍 python的创始人为吉多范罗苏姆&#xf…