第13章 数据库编程(二).ppt
第13课 数据库编程(二)一个基于数据库的点菜小系统开发目标学习CDataBase的意义和作用学习CRecordSet的意义和作用学习有条件的Select语句的查询学习Insert语句的数据库更新操作学习基于对话框的小型系统的开发数据库表模型结构登录对话框(一)登录对话框(二)点菜对话框(一)列表控件列表控件这里有一个标签这里有一个标签用于显示桌台号用于显示桌台号点菜对话框(二)对话框的打开代码CLoginDlg logindlg;/登录对话框if(logindlg.DoModal()!=IDOK)return FALSE;CCookDlg dlg;/点菜对话框m_pMainWnd=&dlg;int nResponse=dlg.DoModal();if(nResponse=IDOK)/TODO:Place code here to handle when the dialog is/dismissed with OKelse if(nResponse=IDCANCEL)/TODO:Place code here to handle when the dialog is/dismissed with Cancel相关的数据库操作CDataBase和CRecordSet的使用方法建立ODBC数据源使用CDataBase和CRecordSet的ODBC直接操作CDatabase:建立与数据源相连接的类常用的成员方法Open(数据源):创建一个指定数据源的数据库连接对象。ExecuteSQL(SQL字符串):执行一个Insert、Update和Delete的SQL语句,如果执行出错,将返回异常,一般不执行Select语句,因为不能返回结果集对象.Close():关闭数据库连接对象。执行数据库的更新操作CDatabase db;/数据库连接对象CString sql;/sql字符串db.Open(cook);sql.Format(insert into 点菜记录(tableNum,dish,price,count,remark)values(%d,%s,%f,%d,%s),iTable,sDish,fPrice,iCount,sRemark);db.ExecuteSQL(sql);执行数据库的更新操作不需要CRecordSet类的支持,因为不需要返回表的查询内容,一般只需要返回成功或失败两种结果即可.操作方法是首先打开数据源,定义数据库更新的SQL语句,然后调用CDatabase的成员方法ExecuteSQL()执行SQL语句即可.CRecordSet必须是执行Select语句时才要使用,因为它需要Select来获得数据表内容.另外,CRecordSet类必须依赖CDatabase类首先创建与数据源的连接后才能使用使用CRecordSet向数据库执行Select语句并返回表查询结果的方法是其成员方法Open(),方法如下:CDatabase db;/数据库连接对象CRecordset rs;/记录集对象CString sql;/sql字符串sql.Format(select*from 桌台编号表);db.Open(cook)/打开数据源连接对象rs.m_pDatabase=&db;/把数据库连接设置给记录集对象rs.Open(CRecordset:forwardOnly,sql);CRecordSet的检索方法原有的检索过程的成员方法MoveFirst、MoveLast、MovePrev、MoveNext、IsBOF、IsEOF将继续使用获得记录集中当前记录的指定字段的值GetFieldValue(数据库对应字段名,存储对应值的CString类型的变量)例如:CString dish,price,type;rs.GetFieldValue(dish,dish);rs.GetFieldValue(price,price);rs.GetFieldValue(type,type);备注:GetFieldValue()得到的字段内容都是以字符串形式得到的,不管数据库里的字段类型是什么。点菜系统的登录界面登录中的数据库访问代码UpdateData(TRUE);CDatabase db;/数据源连接对象CRecordset rs;/记录集对象CString sql;/sql字符串CCookDlg dlg;/点菜对话框 sql.Format(select*from 用户信息表 where user=%s and psw=%s,m_user,m_psw);if(db.Open(cook)/打开数据源连接对象rs.m_pDatabase=&db;/将数据源连接对象设置给记录悸对象rs.Open(CRecordset:forwardOnly,sql);CString name;if(!rs.IsEOF()/只要拥有记录,说明登录用户名和密码正确CDialog:OnOK();/关闭登录对话框rs.Close();/关闭记录集对象db.Close();/数据源连接对象点菜对话框操作(一)点菜对话框操作(二)选择桌台按钮中的部分代码/从点菜名目表中获得菜品名目CDatabase db;/数据库连接对象CRecordset rs;/记录集对象CString sql;/sql字符串CString dish,price,type;int row;sql.Format(select*from 菜品名目表);if(db.Open(cook)/打开数据源连接对象rs.m_pDatabase=&db;rs.Open(CRecordset:forwardOnly,sql);while(!rs.IsEOF()rs.GetFieldValue(dish,dish);rs.GetFieldValue(price,price);rs.GetFieldValue(type,type);row=m_dish.GetItemCount();m_dish.InsertItem(row,dish);m_dish.SetItemText(row,1,price);m_dish.SetItemText(row,2,type);rs.MoveNext();rs.Close();db.Close();确定菜单并发送的操作确定菜单并发送的部分代码(一)int i,row;CString sDish,sRemark;double fPrice;int iTable,iCount;char tmp50;/从点菜名目表中获得菜品名目CDatabase db;/数据库连接对象CString sql;/sql字符串if(db.Open(cook)row=m_record.GetItemCount();/从列表控件中循环取出每一行的内容,然后进行数据库的Insert操作for(i=0;irow;i+)m_record.GetItemText(i,0,tmp,50);iTable=atoi(tmp);确定菜单并发送的部分代码(二)m_record.GetItemText(i,1,tmp,50);sDish=tmp;m_record.GetItemText(i,2,tmp,50);fPrice=atof(tmp);m_record.GetItemText(i,3,tmp,50);iCount=atoi(tmp);m_record.GetItemText(i,4,tmp,50);sRemark=tmp;sql.Format(insert into 点菜记录表(tableNum,dish,price,count,remark)values(%d,%s,%f,%d,%s),iTable,sDish,fPrice,iCount,sRemark);db.ExecuteSQL(sql);/执行数据库更新的操作AfxMessageBox(菜单已经发送!);