连接数据库test 用户名root密码abc
在里面有一个username的表,describe username结果如下
mysql> describe username;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| username | varchar(32) | | PRI | | |
+----------+-------------+------+-----+---------+-------+
mysql> select * from username;
+------+----------+
| id | username |
+------+----------+
| 1 | sfs |
+------+----------+
1 row in set (0.00 sec)
本文目的查找执行select id from username这个语句并打印结果
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MYSQL mysql;
main()
{
char host[32]="localhost";
char user[32]="root";
char passwd[32]="abc";
char dbname[32]="test";
if( mysql_init(&mysql) == NULL )
{
syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n");
return 1;
}
if (mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL)
{
syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
return 1;
}
else syslog(LOG_USER|LOG_INFO, "connect to database: \n");
find_ps();
db_close();
return 0;
}
int db_close()
{
mysql_close(&mysql);
return 0;
}
int find_ps ()
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[1024],username[32];
int res=1;
int *id;
sprintf(sql,"select id from username");
if(mysql_query(&mysql,sql) != 0)
{
syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));
return res;
}
m_res = mysql_store_result(&mysql);
if(m_res==NULL)
{
syslog(LOG_USER|LOG_INFO, "select username Error: %s\n",mysql_error(&mysql));
res = 3;
return res;
}
if(m_row = mysql_fetch_row(m_res))
{
printf("m_row=%d\n",atoi(m_row[0]));
res = 0;
}
mysql_free_result(m_res);
return res;
}
复制代码 编译命令
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果/tmp/ccTGmMS21.o: In function `main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to `mysql_init'
那么参数增加-L/usr/lib/mysql -lmysqlclient
如果
usr/lib/mysql/libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
作者:xouou_53320
时间:2010-8-28 03:00
#include "stdafx.h"
#include
#include
#include
#include
#include
#include "resource.h"
#include "MainDlg.h"
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}
void DBTest(HWND hwnd);
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}
return FALSE;
}
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
DBTest(hwnd);
break;
default:
break;
}
}
void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}
void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
{
char pStatus[10], pMsg[101];
SQLSMALLINT SQLmsglen;
char error[200] = {0};
SQLINTEGER SQLerr;
long erg2 = SQLGetDiagRec(type, sqlHandle,1,
(SQLCHAR *)pStatus,&SQLerr,(SQLCHAR *)pMsg,100,&SQLmsglen);
wsprintf(error,"%s (%d)\n",pMsg,(int)SQLerr);
MessageBox(hwnd,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
}
void ShowDBConnError(HWND hwnd,SQLHDBC hdbc)
{
ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);
}
void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt)
{
ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);
}
void DBTest(HWND hwnd)
{
SQLHENV henv = NULL;
//SQLHDBC hdbc表示一个数据库的连接句柄,和socket连接类似,要访问数据库先要连接
//SQLHDBC: SQL数据库,H句柄,DB是DataBase,C是Connection
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;//代表一个SQL语句,STMT是Statement 语句的意思
SQLRETURN result;//执行结果
/*
SQLCHAR是unsigned char
定义的这个ConnStrIn数组里存放着你要连接到的
数据库的驱动(驱动名)
服务器IP地址(本地的话就是127.0.0.1)
用户名uid
密码pwd
数据库名(Catalog) DataBase
字符编码方式等信息
*/
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=test;CharSet=gbk;";
SQLCHAR ConnStrOut[MAXBUFLEN];
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置管理环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配连接句柄
result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
//连接数据库,ConnStrIn传递过来的DATABASE值,result是执行结果
result = SQLDriverConnect(hdbc,NULL,
ConnStrIn,SQL_NTS,
ConnStrOut,MAXBUFLEN,
(SQLSMALLINT *)0,SQL_DRIVER_NOPROMPT);
if(SQL_ERROR==result)
{
ShowDBConnError(hwnd,hdbc);//显示连接错误
return;
}
//若成功连接,初始化语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//SQL_NTS telling the function the previous parameter is Null-Terminated String,
//please alculate the string length for me
//创建SQL语句
result = SQLPrepare(hstmt,(SQLCHAR*)"select FName,FAge from t_person",SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);//判断是否创建成功
result =SQLExecute(hstmt);//执行语句
CHECKDBSTMTERROR(hwnd,result,hstmt);//判断是否执行成功
/*
查看select语句的执行结果,按行读取,这种方式叫通过游标读取
无论是在JDBC,ADO/ADO.net都以这种方式读取
每次调用SQLFetch()就向下读一行,直到返回值为SQL_DATA_FOUND即末位的时候表示读到了最后
类似于c语言文件访问时的EOF
*/
SQLINTEGER cbsatid=SQL_NTS; //typedef long SQLINTEGER,SQL_NTS是终端标志?
/* 读取第一列的姓名
while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) //hstmt是上面的SQL语句的指针,hstmt一开始就已定义(SQLHSTMT hstmt = NULL)
{
TCHAR name[20];
//SQLGetData()是按列读取,
//第一个参数是SQL语句
//第二个参数是要读取的列号(从1开始编号)
//第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
//第四个参数是要存放到里面的指针
//第五个参数是参数四(缓冲区)的大小,这里等于20字节
//第六个不用管
SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),&cbsatid);
MessageBox(hwnd,name,TEXT("返回结果"),MB_OK);
}
*/
//读取第二列的整数年龄
while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) //hstmt是上面的SQL语句的指针,hstmt一开始就已定义(SQLHSTMT hstmt = NULL)
{
TCHAR name[20];
//SQLGetData()是按列读取,
//第一个参数是SQL语句
//第二个参数是要读取的列号(从1开始编号)
//第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
//第四个参数是要存放到里面的指针
//第五个参数是参数四(缓冲区)的大小,这里等于20字节
//第六个不用管
SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),&cbsatid);
MessageBox(hwnd,name,TEXT("返回结果"),MB_OK);
SQLINTEGER i_age; //typedef long SQLINTEGER
//SQLGetData()是按列读取,
//第一个参数是SQL语句
//第二个参数是要读取的列号(从1开始编号)
//第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
//第四个参数是要存放到里面的指针
//第五个参数是参数四(缓冲区)的大小,这里等于20字节
//第六个不用管
SQLGetData(hstmt,2,SQL_C_LONG,&i_age,sizeof(i_age),&cbsatid);
TCHAR str[20];
wsprintf(str,TEXT("%s年龄是:%d"),name,i_age);
MessageBox(hwnd,str,TEXT("返回结果"),MB_OK);
}
SQLFreeStmt(hstmt,SQL_CLOSE);//释放SQL语句
SQLDisconnect(hdbc); //断开连接的数据库
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
MessageBox(hwnd,TEXT("执行成功"),TEXT("标题"),MB_OK);
}