C语言MySQL操作
更新时间:2024-02-02 05:03: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
#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.}
正在阅读:
C语言MySQL操作02-02
【热门】动物小猫的作文集合五篇03-23
深圳人口与医疗需求预测06-01
世界古代文明及答案11-06
2017-2020周期竞技健美操评分规则修订、重点(1)12-22
ZYJ7电液转辙机学习维护故障处理资料05-09
天正建筑使用技巧04-04
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 语言
- 操作
- MySQL
- 重庆市万州区新田镇人民政府文件
- 醉翁亭记
- 生物学大实验讲义
- 小学优秀传统文化教育总结
- 教科版小学六年级语文上册全册教案
- 基于AT89C51单片机的直流电机控制系统的设计 - 图文
- 中华人民共和国大气污染防治法(2014)
- XX集团公司详细岗位说明书大全-总部业务部职位说明书
- 分层教学,适性发展
- 中药鉴定学 第4章
- 原来做卤菜只需要知道这一点,学会了在家想吃什么卤味就吃什么卤
- 招投标管理规章制度
- 四川卷 文综试题(word版含解析)
- 2015商标法 莱芜
- 结构方程SEM模型案例分析
- 苯-甲苯板式精馏塔设计
- 大学生社团联合会工作心得体会
- 中考26题几何新定义练习
- 2014最新湘少版三年级下册英语全册教案
- 福建2011届高三四地六校协作文综联考卷