vc连接mysql_vc连接mysql

连接数据库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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值