C语言MySQL操作

更新时间:2024-04-23 10:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2、C语言中访问数据库

a)

ODBC简介。ODBC是微软提供的访问数据库的一种标准接口,通过ODBC可以连接MSSQLServer、MYSQL、DB2、Oracle、Access等各种数据库,通过统一的函数进行访问,也就是访问各种数据库都可以使用统一的函数。屏蔽了连接不同数据库的差异性。

b)

除了ODBC之外还有ADO、ADO.net等,Java中有JDBC等。都有连接、结果集、游标、事务、参数化SQL等概念,一通百通。

c)

没安装MYODBC(MYSQL的ODBC驱动)的首先安装MYODBC。http://down1.rupeng.com/download/software/MYODBC.rar d)

sql.h、sqlext.h、sqltypes.h

e)

添加连接库“odbc32.lib odbccp32.lib”。如果使用的是rupeng的DialogBased向导则已经自动添加。如果使用其他向导或者C-Free、PellesC等开发工具,则需要手动添加

f)

看模板代码。不用关心每个函数,用的时候copy以后改一改就可以,理解只要流程、主要概念即可,不要深究。有兴趣的可以研究CHECKDBSTMTERROR宏的实现。

g)

访问数据库可能遇到的错误:连接错误、执行错误。

h)

连接数据库、执行SQL、断开连接。连接字符串。数据库错误处理。

SQLHDBC hdbc:代表一个数据库连接句柄。和Socket里边的Socket连接类似,要访问数据库,先要连接到数据库。SQLHDBC:SQL、H句柄、DB(DataBase)、C(Connection)

SQLHSTMT hstmt:代表一个SQL语句。STMT(Statement,语句) SQLRETURN:执行结果。

ODBC中字符串用SQLCHAR,SQLCHAR其实就是char的别名。

SQLCHAR ConnStrIn[MAXBUFLEN]和char ConnStrIn[MAXBUFLEN]一样。

ConnStrIn:连接字符串,你要连接到的数据库的驱动、ip地址、用户名密码、数据库名(Catalog)等等都在连接字符串里描述。DRIVER:使用的驱动名;SERVER:ip地址;UID:用户名(UserID);PWD(Password):密码。DataBase:数据库名,Catalog。

SQLDriverConnect:创建到数据库的连接,使用ConnStrIn连接。result表示执行结果。如果失败了SQL_ERROR==result。ShowDBConnError(hwnd,hdbc);来显示“连接错误”。

result = SQLPrepare(hstmt,(SQLCHAR*)\values(20,'kider')\。创建SQL语句的句柄。

result =SQLExecute(hstmt);:执行SQL语句。

SQLFreeStmt(hstmt,SQL_CLOSE);:释放SQL语句

SQLDisconnect(hdbc);:断开数据库连接。

#include \#include #include #include #include #include #include \#include \#define LOGIN_TIMEOUT 30 #define MAXBUFLEN 255

#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}

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 *)pMsg,100,&SQLmsglen);

wsprintf(error,\

MessageBox(hwnd,error,TEXT(\数据库执行错误\}

void ShowDBConnError(HWND hwnd,SQLHDBC hdbc) {

ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc); }

*)pStatus,&SQLerr,(SQLCHAR

void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt) {

ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt); }

void DBTest(HWND hwnd) {

SQLHENV henv = NULL; SQLHDBC hdbc = NULL; SQLHSTMT hstmt = NULL;

SQLRETURN result; SQLCHAR ConnStrIn[MAXBUFLEN]

=

\

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);

//连接数据库

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 result = SQLPrepare(hstmt,(SQLCHAR*)\values(20,'kider')\

CHECKDBSTMTERROR(hwnd,result,hstmt); result =SQLExecute(hstmt);

CHECKDBSTMTERROR(hwnd,result,hstmt); SQLFreeStmt(hstmt,SQL_CLOSE);

into

T_Person(FAge,FName)

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC,hdbc); SQLFreeHandle(SQL_HANDLE_ENV,henv);

MessageBox(hwnd,TEXT(\执行成功\标题\}

开发环境的搭建:

(1)如鹏版绿色MYSQL的下载:

http://down1.rupeng.com/download/software/RuPengGreenMYSQL.rar (2)ODBC连接MYSQL的驱动MYODBC下载:

http://down1.rupeng.com/download/software/MYODBC.rar (3)管理工具SQLyog下载:

http://down1.rupeng.com/download/software/SQLyog.rar

依次安装三个软件。如鹏版绿色MYSQL的使用,使用SQLyog连接数据库。 注意:如果初始化MYSQL以后移动了MYSQL的文件夹,那么需要重新运行“运行前先初始化.exe”。 1、执行“启动MySQL.bat”

2、运行SQLyog。如鹏版MYSQL,用户名密码都是root。 什么是数据库,数据库能做什么?

Int:整数;varchar:字符串(String),Var(可变的),Char(字符);

Boolean、char、date

怎么使用Varchar,要指定长度,就像申明char buff = new char[200]

1、处理数据库查询

序号从1开始,不是0 1. 2. 3. 4. 5. 6. 7. 8.

SQLINTEGER cbsatid=SQL_NTS;

while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) {

SQLCHAR name[20];

SQLGetData(hstmt,1,SQL_C_CHAR,name,20,&cbsatid); }

复制代码

1. SQLINTEGER cbsatid=SQL_NTS;

2. while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) 3. {

4. SQLINTEGER i;

5. SQLGetData(hstmt,2,SQL_C_LONG,&i,sizeof(SQLINTEGER),&cbsatid); 6. }

复制代码

乱码问题解决方式,连接字符串使用GBK,修改数据库默认编码为gbk

4、保存HDBC到全局变量中,长连接、短连接。比如Java、C#中访问数据库复杂多少。一通百通。

1. SQLINTEGER cbsatid=SQL_NTS;

2. //需要一行一行的读取,这种方式就叫做通过游标读取,无论是在JDBC、

ADO/ADO.net。。。结果集

3. //调用SQLFetch一次就向下读取一行,直到返回值为SQL_NO_DATA_FOUND

的时候表示读到了最后

4. //是不是和C语言文件访问中EOF有点像。

5. while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) 6. {

7. TCHAR name[20]; //字符数组,SQLCHAR其实就是char的一个别名,

所以和char name[20]一样。

8. //调用SQLGetData来取列(Column)的内容 9. //第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从

1开始)

10. //第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_

开头的都是可选值)

11. //第四个参数就是要接收的值的指针!!! 12. //第五个是指针指向的缓冲区的大小 13. //第六个不用管,那么调就行

14. SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(

SQLCHAR),&cbsatid);

15. MessageBox(hwnd,name,TEXT(\16. } 17.

18.while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) 19. {

20. SQLINTEGER i; //字符数组,SQLCHAR其实就是char的一个别名,所

以和char name[20]一样。

21. //调用SQLGetData来取列(Column)的内容 22. //第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从

1开始)

23. //第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_

开头的都是可选值)

24. //第四个参数就是要接收的值的指针!!! 25. //第五个是指针指向的缓冲区的大小 26. //第六个不用管,那么调就行

27. SQLGetData(hstmt,2,SQL_C_LONG,&i,sizeof(i),&cbsatid); 28. TCHAR name[20];

29. SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR)

,&cbsatid); 30. TCHAR s[20];

31. wsprintf(s,TEXT(\年龄是:%d\32.

33. MessageBox(hwnd,s,TEXT(\34. }

35.result = SQLPrepare(hstmt,(SQLCHAR*)\

from T_User\

36.CHECKDBSTMTERROR(hwnd,result,hstmt); 37. result =SQLExecute(hstmt);

38. CHECKDBSTMTERROR(hwnd,result,hstmt); 39.SQLINTEGER cbsatid=SQL_NTS; 40.TCHAR inputUserName[20];

41.GetDlgItemText(hwnd,IDC_EDITUSERNAME,inputUserName,sizeof(input

UserName)/sizeof(TCHAR)); 42.TCHAR inputPassword[20];

43.GetDlgItemText(hwnd,IDC_EDITPASSWORD,inputPassword,sizeof(input

Password)/sizeof(TCHAR)); 44.

45.BOOL found=FALSE;

46.while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND) 47. {

48. TCHAR userName[20];

49. SQLGetData(hstmt,1,SQL_C_CHAR,userName,sizeof(userName)/sizeo

f(TCHAR),&cbsatid); 50. TCHAR password[20];

51. SQLGetData(hstmt,2,SQL_C_CHAR,password,sizeof(password)/sizeo

f(TCHAR),&cbsatid);

52. if(0==lstrcmp(inputUserName,userName)) 53. {

54. if(0==lstrcmp(inputPassword,password)) 55. {

56. MessageBox(hwnd,TEXT(\输入正确,登陆成功!\提示

\

57. found = TRUE; 58. break; 59. } 60. } 61. }

62.if(FALSE==found) 63.{

64. MessageBox(hwnd,TEXT(\输入错误\报错

\65.}

本文来源:https://www.bwwdw.com/article/opap.html

Top