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
#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操作04-23
企业厂长竞聘演讲稿12-02
全国红十字青少年自救互救知识竞赛试题12-20
V1关于申请筹建XX幼儿园的请示与项目书131216V01-19
心理健康讲座读后感12-31
怎样解决等离子弧不稳定03-08
计算机教师个人教学工作年终总结03-26
人大专门委员会职能作用论文12-10
实验报告报审表01-07
运动学基础试卷A06-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 语言
- 操作
- MySQL
- NAND FLASH 编程总结
- 新人教版四年级下册数学优秀电子教案及教学反思 - 图文
- 《新泉小学校发展计划文本》上册修改版 - 图文
- 中考26题几何新定义练习
- 基于AT89C51单片机的直流电机控制系统的设计 - 图文
- XX集团公司详细岗位说明书大全-总部业务部职位说明书
- 中华人民共和国大气污染防治法(2014)
- 16 馒头 米饭
- 小学优秀传统文化教育总结
- 专题三完形填空cloze test
- 高架施工组织设计(S6-7标) - 图文
- 暑假二升三奥数
- 9分 雅思范文
- 《采薇》优秀教案
- 2019年基层党支部党员党性分析材料3篇
- 企业资源计划系统课程设计指导书
- CDMA直放站带外抑制-67dBm测试解决方案
- 招投标管理规章制度
- 形容词和副词练习142题附答案
- 第2章 金属切削机床基础知识1