项目中对数据库的操作
首先,介绍一下关系型数据库的相关知识:
我们最起码我说接触的都是关系模型:
关系数据结构:关系模型的结构非常单一。关系型数据库以行和列的形式存储数据。
关系操作:关系模型给出了关系操作的能力。
关系完整性约束:实体完整性、参照完整性和用户自定义完整性。用户定义的完整性是应用领域需要遵循循环的约束条件,体现了具体领域中的语义约束。
ADO(ActiveX Data Object)是当前流行的数据库访问技术:ADO是Microsoft数据库应用程序开发的新接口,建立在OLE DB底层之上的高层数据库访问技术。
在visual C++中应用ADO技术:方法有两种
1.使用ActiveX控件来操作,这种方法简单,但是格式太固定,没怎么用过。
2.使用ADO对象操作数据库,虽然复杂,但是具有更大的灵活性,只要将ADO对象封装到类中也可以很好的简化数据库的操作。
ADO的对象有七个,但是我在使用的过程中只使用过两个,一个是连接对象(connection)、一个是记录集对象(Recordset)。每个对象都有各自的方法对应各自的操作。主要的方法对应如下:
实例:
1.在新建的ADO类中的头文件中://动态链接库的导入
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
2.创建对象: _ConnectionPtr m_pConnection; //定义连接对象指针
_RecordsetPtr m_pRecordset; //定义记录集对象指针
3.对用的函数:
//该函数用于初始化该类,用于连接数据库
void ADOConn::OnInitADOConn()
{
try
{
m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例
//设定连接字符串
_bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CTXSYS;Data Source=BABY-PC";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
}
//该函数用于执行sql语句
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL) //判断数据库是否连接
OnInitADOConn(); //连接数据库
m_pConnection->Execute(bstrSQL,NULL,adCmdText); //执行sql语句
return true;
}
catch(_com_error e)
{
e.Description();
return false;
}
}
//该函数用于关闭记录集并断开数据库
void ADOConn::ExitConnect()
{
if(m_pRecordset!=NULL) //判断记录集是否打开
m_pRecordset->Close(); //关闭记录集
m_pConnection->Close(); //断开数据库的连接
}
//该函数通过sql语句,打开记录集
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if(m_pConnection) //判断数据库是否连接
OnInitADOConn(); //连接数据库
m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); //打开记录集
}
catch(_com_error e)
{
e.Description();
}
return m_pRecordset; //返回记录集指针
}
//设置连接字符串:新建dul文件:通过测试连接成功,然后用记事本打开,得到连接字符串 使用odbc连接数据库,是同样的方法,不过要配置odbc数据源
相应的操作数据库:
添加:
CString sql,ph;
sql.Format("select * from TB_GOODS");
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
m_AdoConn.m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
if(!m_AdoConn.m_pRecordset->adoEOF)
{
while(!m_AdoConn.m_pRecordset->adoEOF)
{
ph=(char *)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPBH");
m_AdoConn.m_pRecordset->MoveNext();
}
m_Spbh.Format("SP%03d",atoi(ph.Right(3))+1);
}
else
{
m_Spbh="SP001";
}
m_AdoConn.ExitConnect();
m_Spmc="";
m_Spjm="";
m_Splb="";
m_Spdw="";
m_Txm="0";
m_Jhjg="0";
m_Xsjg="0";
UpdateData(FALSE);
保存:
CString sql;
UpdateData(TRUE);
if(m_Spmc.IsEmpty() || m_Spjm.IsEmpty() || m_Spdw.IsEmpty())
{
AfxMessageBox("该数据不能为空,请将数据补充完整");
return;
}
sql.Format("insert into TB_GOODS (SPBH,SPMC,SPJM,SPLB,SPDW,TXM,JHJG,XSJG\
) values ('%s','%s','%s','%s','%s','%s','%s','%s')", m_Spbh,m_Spmc,m_Spjm,m_Splb,m_Spdw,m_Txm,m_Jhjg,m_Xsjg);
// AfxMessageBox(sql); 上面对应的,命名是错的可是不报错啊,执行都没有报错,真是的
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_AdoConn.ExitConnect();
m_Grid.DeleteAllItems(); //这句话没有执行啊? 不不不,语句执行了,但是数据没有添加成功所以没变
AddToGrid();
修改:
CString sql;
UpdateData(TRUE);
if(m_Spmc.IsEmpty() || m_Spjm.IsEmpty() || m_Spdw.IsEmpty())
{
AfxMessageBox("该数据不能为空,请将数据补充完整");
return;
}
sql.Format("update TB_GOODS set SPMC='%s',SPJM='%s',SPLB='%s',SPDW='%s',TXM='%s',JHJG='%s',XSJG='%s' where SPBH='%s'",
m_Spmc,m_Spjm,m_Splb,m_Spdw,m_Txm,m_Jhjg,m_Xsjg,m_Spbh);
// AfxMessageBox(sql); 上面对应的,命名是错的可是不报错啊,执行都没有报错,真是的
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_AdoConn.ExitConnect();
m_Grid.DeleteAllItems(); //这句话没有执行啊? 不不不,语句执行了,但是数据没有添加成功所以没变
AddToGrid();
删除:
CString sql;
UpdateData(TRUE);
if(m_Spmc.IsEmpty() || m_Spjm.IsEmpty() || m_Spdw.IsEmpty())
{
AfxMessageBox("该数据不能为空,请将数据补充完整");
return;
}
sql.Format("delete from TB_GOODS where SPBH='%s'",m_Spbh);
// AfxMessageBox(sql); 上面对应的,命名是错的可是不报错啊,执行都没有报错,真是的
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
m_AdoConn.ExecuteSQL((_bstr_t)sql);
m_AdoConn.ExitConnect();
m_Grid.DeleteAllItems(); //这句话没有执行啊? 不不不,语句执行了,但是数据没有添加成功所以没变
AddToGrid();
查询:
UpdateData(TRUE);
CString field,condition,sql;
m_Combo2.GetWindowText(condition); //获得下拉列表的数据赋值到相应的变量中
switch(m_Combo1.GetCurSel()) //获取下拉列表中的位置,然后进行相应的赋值
{
case 0:
field="SPBH";
break;
case 1:
field="SPJM";
break;
case 2:
field="SPLB";
break;
case 3:
field="SPMC";
break;
}
if(condition=="LIKE") //通过条件的判断,对sql语句进行初始化
sql.Format("select * from TB_GOODS where %s %s '%s%s%s' ",field,condition,"%",m_Text,"%");
else
// AfxMessageBox(field+condition+m_Text);
sql.Format("select * from TB_GOODS where %s %s '%s' ",field,condition,m_Text);
m_Grid.DeleteAllItems();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
// AfxMessageBox(sql);
m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql); //执行sql语句,获取记录集的指针
int i=0;
while(!m_AdoConn.m_pRecordset->adoEOF) //将记录集中的数据,显示在列表视图控件中
{
m_Grid.InsertItem(i,"");
m_Grid.SetItemText(i,0,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPBH"));
m_Grid.SetItemText(i,1,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPMC"));
m_Grid.SetItemText(i,2,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPJM"));
m_Grid.SetItemText(i,3,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPLB"));
m_Grid.SetItemText(i,4,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPDW"));
m_Grid.SetItemText(i,5,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("TXM"));
m_Grid.SetItemText(i,6,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("JHJG"));
m_Grid.SetItemText(i,7,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("XSJG"));
m_AdoConn.m_pRecordset->MoveNext();
i++;
}
m_AdoConn.ExitConnect();
这些基本的对数据库的操作。
数据的显示主要以列表视图控件来控制的:
获取列表中的单击事件:
void CGoodsDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int pos;
pos=m_Grid.GetSelectionMark();
m_Spbh=m_Grid.GetItemText(pos,0);
m_Spmc=m_Grid.GetItemText(pos,1);
m_Spjm=m_Grid.GetItemText(pos,2);
m_Splb=m_Grid.GetItemText(pos,3);
m_Spdw=m_Grid.GetItemText(pos,4);
m_Txm=m_Grid.GetItemText(pos,5);
m_Jhjg=m_Grid.GetItemText(pos,6);
m_Xsjg=m_Grid.GetItemText(pos,7);
UpdateData(FALSE);
*pResult = 0;
}
获取数据库的所有信息并显示:
void CGoodsDlg::AddToGrid()
{
ADOConn m_AdoConn; //这就是类的对象的定义
m_AdoConn.OnInitADOConn(); //连接数据库
CString sql;
int i=0;
sql.Format("select * from TB_GOODS"); //设置sql语句
m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql); //执行sql语句
while(!m_AdoConn.m_pRecordset->adoEOF)
{
m_Grid.InsertItem(i,""); //向列表视图控件中插入行
//向列表视图控件添加列
m_Grid.SetItemText(i,0,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPBH"));
m_Grid.SetItemText(i,1,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPMC"));
m_Grid.SetItemText(i,2,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPJM"));
m_Grid.SetItemText(i,3,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPLB"));
m_Grid.SetItemText(i,4,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("SPDW"));
m_Grid.SetItemText(i,5,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("TXM"));
m_Grid.SetItemText(i,6,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("JHJG"));
m_Grid.SetItemText(i,7,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("XSJG"));
m_AdoConn.m_pRecordset->MoveNext(); //记录集指针移动到下一条
i++;
}
m_AdoConn.ExitConnect(); //关闭记录集断开数据库连接
}
这些就是在MFC项目中对数据库的基本操作方法及代码了,还有很多,以后再补充吧。
项目中对数据库的操作相关推荐
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- XamarinSQLite教程在Xamarin.Android项目中定位数据库文件
XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...
- XamarinSQLite教程在Xamarin.Android项目中使用数据库
XamarinSQLite教程在Xamarin.Android项目中使用数据库 在Xamarin.Android项目中使用预设数据库的具体操作步骤如下: (1)创建一个Xamarin.Android项 ...
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...
- XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的"前 ...
- xamarin怎么调用java的_XamarinSQLite教程在Xamarin.Android项目中使用数据库
XamarinSQLite教程在Xamarin.Android项目中使用数据库 在Xamarin.Android项目中使用预设数据库的具体操作步骤如下: (1)创建一个Xamarin.Android项 ...
- html 连续发送数据库,不要在循环中对数据库进行操作.htm
不要在循环中对数据库进行操作 不要在循环中对数据库进行操作 性能非常低下,应改为用IN查询 示例: 1.在循环中查询数据库,增加gv_title属性(性能低下) foreach ($res['data ...
- java crud_Java 8流中的数据库CRUD操作
java crud 在开始使用新工具时要克服的最大障碍是让您着手处理小事情. 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询. 为了帮助 ...
- Java 8流中的数据库CRUD操作
在开始使用新工具时要克服的最大障碍是让您着手处理小事情. 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询. 为了帮助您开始使用Strea ...
最新文章
- 如何使用Swift获取App版本和内部版本号?
- 液晶显示原理与ILI9341的使用
- 【自动驾驶】28.【右手坐标系】与【右手法则】分析、【右手法则的正方向】 与 【逆时针为正方向】 的分析
- 七、Sqoop架构,安装和基本使用
- 神奇的 Go init 函数
- Gartner认为安全性将取代成本和敏捷性成为政府部门采用云服务的首要原因
- CocosStudio的节点如何使用自定义shader
- 知乎上已获千赞,持续更新中
- 由object元素引出的事件注册问题和层级显示问题
- 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
- Android 开发 带图像的Toast提示
- Centos添加supervisor为服务,启动/关闭,设置开机启动服务
- 笔记本电脑如何保养_锂电池保养技术 锂电池使用注意事项 锂电池技术培训
- 检索HTML元素的位置(X,Y)
- 我国共计34个省级行政区,包括23个省、5个自治区、4个直辖市、2个特别行政区。
- python的pyaudio教程入门_Python音频操作工具PyAudio上手教程详解
- ppc手机用蓝牙和电脑同步上网设置教程
- Eureka集群间通信
- 从word中复制图片到网页编辑器中
- 设置iPhone来电铃声(图文教程)