未购买此贴可以在线观看在线FLV格式的视频:
http://player.youku.com/player.php/sid/XODA5MzM3MDg=/v.swf
购买此贴后可以得到清晰版的下载地址。
板书:
《C语言也能干大事》第十六节
数据库开发3
本课程的参考教材:杨中科的《程序员的SQL金典》第四章
1、SELECT基本用法
a)
检索所有列、检索指定列
b)
按条件过滤。通配符、Between and
select * from T_Employee where FSalary>4000 and FSalary<8000
select * from T_Employee where FSalary BETWEEN 4000 And 8000
c)
数据汇总
select SUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary) from T_Employee
select SUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary) from T_Employee where FSalary<8000
select COUNT(*) from T_Employee where FSalary>5000。满足条件的数据个数
d)
排序
Ascending:ASC,升序
Descending:Des,降序
select * from T_Employee order by FSalary desc
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*)"insert into T_Person(FAge,FName) values(20,'kider')",SQL_NTS)。创建SQL语句的句柄。
result =SQLExecute(hstmt);:执行SQL语句。
SQLFreeStmt(hstmt,SQL_CLOSE);:释放SQL语句
SQLDisconnect(hdbc);:断开数据库连接。
课下参考《程序员的SQL金典》进行深一步的学习和预习。
模板代码:
购买此贴后可以得到整个工程的源代码:
- #include "stdafx.h"
- #include <windows.h>
- #include <windowsx.h>
- #include <sql.h>
- #include <sqlext.h>
- #include <sqltypes.h>
- #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;}
- 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 = NULL;
- SQLHSTMT hstmt = NULL;
- SQLRETURN result;
- 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);
- //连接数据库
- 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*)"insert into T_Person(FAge,FName) values(20,'kider')",SQL_NTS);
- CHECKDBSTMTERROR(hwnd,result,hstmt);
- result =SQLExecute(hstmt);
- CHECKDBSTMTERROR(hwnd,result,hstmt);
- SQLFreeStmt(hstmt,SQL_CLOSE);
- SQLDisconnect(hdbc);
- SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
- SQLFreeHandle(SQL_HANDLE_ENV,henv);
- MessageBox(hwnd,TEXT("执行成功"),TEXT("标题"),MB_OK);
- }
复制代码