返回列表 发帖

【教学视频】《C语言也能干大事》第十六节:数据库开发3

【秘籍:免费获得大量鹏币】|【立即购买鹏币(仅需5 元)】
帖子只需购买一次即可以永久使用,不需要每次访问的时候都购买。购买后将会看到如下的视频、资料等下载地址
本主题需向作者支付 50 鹏币 才能浏览 购买主题 已购买人数:428  记录
未购买此贴可以在线观看在线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,升序


DescendingDes,降序


select * from T_Employee order by FSalary desc


2、C语言中访问数据库


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


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


c)
没安装MYODBC(MYSQLODBC驱动)的首先安装MYODBChttp://down1.rupeng.com/download/software/MYODBC.rar


d)
sql.hsqlext.hsqltypes.h


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


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


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


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


SQLHDBC hdbc:代表一个数据库连接句柄。和Socket里边的Socket连接类似,要访问数据库,先要连接到数据库。SQLHDBCSQLH句柄、DBDataBase)、CConnection


SQLHSTMT hstmt:代表一个SQL语句。STMTStatement,语句)


SQLRETURN:执行结果。


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


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


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


SQLDriverConnect:创建到数据库的连接,使用ConnStrIn连接。result表示执行结果。如果失败了SQL_ERROR==resultShowDBConnError(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金典》进行深一步的学习和预习。
模板代码:
购买此贴后可以得到整个工程的源代码:
  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <windowsx.h>
  4. #include <sql.h>
  5. #include <sqlext.h>
  6. #include <sqltypes.h>
  7. #include "resource.h"
  8. #include "MainDlg.h"
  9. #define LOGIN_TIMEOUT 30
  10. #define MAXBUFLEN 255
  11. #define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}

  12. BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  13. {
  14.     switch(uMsg)
  15.     {
  16.         HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
  17.         HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
  18.   HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
  19.     }
  20.     return FALSE;
  21. }
  22. BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  23. {
  24.     return TRUE;
  25. }
  26. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  27. {
  28.     switch(id)
  29.     {
  30.         case IDC_OK:
  31.    DBTest(hwnd);
  32.         break;
  33.         default:
  34.   break;
  35.     }
  36. }
  37. void Main_OnClose(HWND hwnd)
  38. {
  39.     EndDialog(hwnd, 0);
  40. }
  41. void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
  42. {
  43.     char pStatus[10], pMsg[101];
  44.     SQLSMALLINT SQLmsglen;
  45.     char error[200] = {0};
  46.     SQLINTEGER SQLerr;
  47.     long erg2 = SQLGetDiagRec(type, sqlHandle,1,
  48.                               (SQLCHAR *)pStatus,&SQLerr,(SQLCHAR *)pMsg,100,&SQLmsglen);
  49.     wsprintf(error,"%s (%d)\n",pMsg,(int)SQLerr);
  50.     MessageBox(hwnd,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
  51. }
  52. void ShowDBConnError(HWND hwnd,SQLHDBC hdbc)
  53. {
  54. ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);
  55. }
  56. void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt)
  57. {
  58. ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);
  59. }

  60. void DBTest(HWND hwnd)
  61. {
  62.     SQLHENV henv = NULL;
  63.     SQLHDBC hdbc = NULL;
  64.     SQLHSTMT hstmt = NULL;
  65.     SQLRETURN result;
  66.     SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=test;CharSet=gbk;";
  67.     SQLCHAR ConnStrOut[MAXBUFLEN];
  68. //分配环境句柄
  69.     result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  70. //设置管理环境属性
  71.     result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
  72. //分配连接句柄
  73.     result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
  74. //设置连接属性
  75.     result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
  76. //连接数据库
  77.     result = SQLDriverConnect(hdbc,NULL,
  78.                               ConnStrIn,SQL_NTS,
  79.                               ConnStrOut,MAXBUFLEN,
  80.                               (SQLSMALLINT *)0,SQL_DRIVER_NOPROMPT);
  81.     if(SQL_ERROR==result)
  82.     {
  83.        ShowDBConnError(hwnd,hdbc);
  84.        return;
  85.     }
  86. //初始化语句句柄
  87.     result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
  88.     //SQL_NTS telling the function the previous parameter is Null-Terminated String,
  89. //please alculate the string length for me   
  90. result = SQLPrepare(hstmt,(SQLCHAR*)"insert into T_Person(FAge,FName) values(20,'kider')",SQL_NTS);
  91. CHECKDBSTMTERROR(hwnd,result,hstmt);
  92.     result =SQLExecute(hstmt);
  93.     CHECKDBSTMTERROR(hwnd,result,hstmt);
  94. SQLFreeStmt(hstmt,SQL_CLOSE);
  95.     SQLDisconnect(hdbc);
  96.     SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
  97.     SQLFreeHandle(SQL_HANDLE_ENV,henv);
  98. MessageBox(hwnd,TEXT("执行成功"),TEXT("标题"),MB_OK);
  99. }
复制代码




购买主题 已购买人数:428  记录

按照老师的方法编译运行后出现 ODBC 5.1Driver Table 'test.t_person' doesn't exist(1146)
很是奇怪。以为名字起错了,于是查阅MySQL命名规则发现
数据库与表名。MySQL中数据库和表名对应于服务器主机上的基本文件系统中的目录和文件。因此,数据库与表名是否区分大小写取决于主机上的操作系统处理文件名的方式。运行在UNIX 上的服务器处理数据库名和表名是区分大小写的,因为UNIX 的文件名是区分大小写的。而Windows 文件名是不区分大小写的,所以运行在Windows上的服务器处理数据库名和表名也是不区分大小写的。如果在UNIX 服务器上创建一个某天可能会移到Windows 服务器上的数据库,应该意识到这个特性:如果现在创建了两个分别名为abc 和ABC 的表,它们在Windows 机器上将是没有区别的。避免这种情况发生的一种方法是选择一种字符(如小写),总是以这种字符创建数据库和表名。这样,在将数据库移到不同的服务器时,名称的大小写便不会产生问题。而且名称可由服务器所采用的字符集中任意字母、数字、“_”和“ $”组成。
所以自己名字也没弄错啊。。。。。
发现1146号错误就是表不存在的意思,可是明明在啊。后来查阅一个php连接mysql的类似问题,说是test 库中没有这个表。启发。这个程序就ConnStrIn[MAXBUFLEN]这里提及了test再看sqlyog发现我的表是新定义在了一个叫‘实验’的数据库下的,于是把ConnStrIn[MAXBUFLEN]中的test改为实验。。。。。。。好了。。。。DATABASE这个是必须有的吧?

没有认真听课的后果啊。。。。

[ 本帖最后由 freeza 于 2009-7-27 09:22 编辑 ]
1

评分人数

TOP

哈哈终于明白了~~~~

在这节课我绕了不少圈子,就是我明明是拿了杨老师的模板代码写的啊!!!!为什么老是在连接的时候老是报错呢~~~~

错误码是这样的:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
--------------------Configuration: dv5 - Win32 Debug--------------------
Compiling...
MainDlg.cpp
E:\gongju\c\vc6\gongc\dv5\MainDlg.cpp(32) : error C2065: 'DBTest' : undeclared identifier
E:\gongju\c\vc6\gongc\dv5\MainDlg.cpp(63) : error C2373: 'DBTest' : redefinition; different type modifiers
Generating Code...
Compiling...
Main.cpp
Generating Code...
执行 cl.exe 时出错.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


无论我怎么改就是不对,这是为什么呢~~~~~~~~~~
一个小时过去了.........正看反看视频这样没有错啊......为什么我就偏偏错了呢~~~~~~

在我已经无望这际,再只细看了错误码,什么DBTest什么的.....

哦,我突然茅塞顿开想起杨老师以前课上讲的函数再前面调用时要在.H文件里加这个函数.
没想到真的就OK了.........什么错误也解决了.....
所以学习还是要细心为好~~~~
1

评分人数

    • 杨中科: 感谢分享。细心和认真的思考是非常重要的鹏币 + 1

TOP

终于看到老大的新课了,顶起~~~

TOP

这么快就出新课了,要加油跟上
提醒自己   08年6月30日开始自学C

TOP

老大辛苦了,谢过!万分谢过!
[fly]三维动画学习中……fly]
kider@rupeng.com

TOP

跟着老师走。。。。。。。。。。

TOP

我也看看。

TOP

讲得很好,脉络很清晰,谢谢。

TOP

支持一下,同学们加油!

TOP

哦,又一新的一节罗,十五课还没时间看呀,没得鹏币罗,需要去购买了!
往日成空已了然,而今欣然迷茫,前事已成忧!晓知理,持之事,费之力,必成大器!

TOP

总算成功了!不知道为什么在c-free中老师报莫名奇妙的错误!

TOP

呵呵,来下了的说~~
未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!

TOP

数据库 合意

由于考三级数据库,前面几节课很轻松~   学习~

TOP

请老师和同学指教

我原来是下了MSSQL2000来学习数据库的,老师课上用MYSQL,而:
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=test;CharSet=gbk;";
这一句不知道怎么写,请大家指教~


TOP

补充

我是讲如何使用MSSQL2000来代替MYSQL,这方面自己不太清楚   万分感谢~
                       

TOP

根据我猜测哈  应该是这不一样
DRIVER={MySQL ODBC 5.1 Driver};
你要去找到MSSQL2000 的驱动吧....

TOP

支持,顶起老大

TOP

如何使程序有XP风格

TOP

  1.         SQLINTEGER cbsatid=SQL_NTS;
  2.         if(SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
  3.         {
  4.                 mbresult = MessageBox(hwnd,TEXT("用户已存在,更改密码?"),TEXT("提示"),MB_YESNO|MB_ICONINFORMATION);
  5.                 if(IDYES == mbresult)
  6.                 {
  7.                         //初始化语句句柄
  8.                         result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
  9.                         TCHAR updatesql[255];
  10.                         ZeroMemory(updatesql,sizeof(updatesql)/sizeof(TCHAR));                                       
  11.                         wsprintf(updatesql,"UPDATE T_User Set FPassword='%s' where FUserName='%s'",Password,UserName);
  12.                         result = SQLPrepare(hstmt,(SQLCHAR*)updatesql,SQL_NTS);
  13.                         CHECKDBSTMTERROR(hwnd,result,hstmt);
  14.                         result =SQLExecute(hstmt);//执行SQL语句
  15.                         CHECKDBSTMTERROR(hwnd,result,hstmt);
  16.                         MessageBox(hwnd,TEXT("修改成功"),TEXT("提示"),MB_OK|MB_ICONINFORMATION);
  17.                 }
  18.         }
复制代码
当我想运行update时程序报错“无效的游标状态”,请问杨老师如何解决呢?
自己解决了,加上红字部分

TOP

惭愧,仅仅是拷贝老师的代码都老出错,原来那4个函数的声明不能放在头文件里
总算在C-Free和VC下通过了,竟然花了我不少时间 ,真的是惭愧啊
   说老实话,VC里在工具里设置代码的颜色都能生效,但是其他设置它的颜色都不生效,而且程序还老不稳定
  我还是先把C-Free混熟了再研究VC

TOP

第十六,十七节怎么都下载不了啊?????????

TOP

不会吧。。 我看看去。。
业余做音乐 梦想做音源 成都的 好好学C语言 呵呵。。

TOP

好教材,好教程
值得学习

TOP

不会吧。。 我看看去。。

TOP

result = SQLPrepare(hstmt,(SQLCHAR*)updatesql,SQL_NTS);

执行updata后result会变为-1
请高人指教怎么改

TOP

怎么要那么多的金币啊~

TOP

不能下载啊?管理员修复一下吧

TOP

这课真是好!

TOP

第十六接下不下来

TOP

返回列表