我用了近三周的时间才摸清了VC与数据库结合的来龙去脉,期间由于参考书的错误便我走了不少弯路,现在虽然只还是不能有很深的理解,但是已基本上能对简单的数据库进行控制,现借CSND之宝地记我的学习历程。以便给自己和后学者一点警告和启示!
一、添加ADO Data控件与DataGrid控件:
ADO Data 控件是使用ADO技术访问数据库的具体实现。首先,可以用ADO Data 控件快速地建立一个到数据库的连接;其次,ADO Data控件使用RECORDSET对象对存储在数据库中数据的访问;第三,ADO Data控件可以执行大部分数据库访问操作,不过它不能显示数据库中的数据,要与其它控制结合来使用。而DataGrid以表格的形式显示结果,它要ADO Data控件提供数据源。更详细的信息可以找相关的资料。
这两个控件都要手动加到控件工具栏上,从工具栏上选择这两个控件放到对话框中后要对它们进行设置,要重点注意以下几点:1、ADO Data 只是用来连接数据库,所以选择不可见;2、ADO Data要设置连接属性,这里要对数据库与登录方式进行选择,因此这里要稍加注意;3、DataGrid控件要与ADO Data相连接。
到目前我认为ADO Data与DataGrid主要用来进行数据库数据的显示。如有不对,请指正。谢谢!
二、对数据显示的处理:
数据显示时往往要对其进行处理才能达到用户的满意。首先,ADO Data的属性中记录源中的命令类型中选择1-adCmdText,然后在SQL编辑框中输入SQL语句,注意在这要把SQL语句写正确,我在这里因为少写了个GO而困扰了N久!(CommandType:指明形成记录集的命令的类型,为1-adCmdText表示形成记录集的是SQL命令,为2-adCmdTable表示记录集由表构成,为4-adCmdStoredProc由存储过程生成记录集,为8-adCmdUnknown未知命令类型。)
然后在对话框初始化时对显示进行控制,可以添加初始化函数,SetRecordSource()函数功能是设置ADO Data控件的数据源,参数为SELECT语句,因此可以用AS关键字设置显示标题,接着用Refresh()函数据刷新结果集。 GetColumns()函数可以返回相应的Columns对象,使用GetItem(vIndex)可以返回指定列对应的Columns对象。
当然,这以上几步可以写成一个REFRES函数,方便调用。代码类似如下所列:
m_adodc.SetRecordSource("SELECT Emp_id,Dep_name as 员工姓名,sex as 性别,title as 职务,wage as 工资 FROM Employees");
m_adodc.Refresh();
_variant_t vIndex;
vIndex=long(0);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);
vIndex=long(1);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex=long(2);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(80);
vIndex=long(3);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex=long(4);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(90);
三、使用ADO访问数据库:
1、导入ADO库文件。
用#import引入ADO库文件
#import "c:/program files/common files/system/ado/msado15.dll"no_namespaces rename("EOF" adoEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。
2、添加类:这个类现对数据库的连接、执行、退出连接等函数据,以便在以后应用。代码如下:
#if !defined(AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_)
#define AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_
//#include "C:/Program Files/Common Files/System/ado/msader15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
public:
_RecordsetPtr m_pRecordset;//指向CONNECTION对象的指针
_ConnectionPtr m_pConnection;//返回查询结果
public:
void ExitConnect();//关闭记录集与连接
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行没有返回结果的SQL语句
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询语句可以返回结果
void OnInitADOConn();//初始化连接数据库
ADOConn();
virtual ~ADOConn();
};
具体的函数据如下:
请细细地看这些代码,看代码比看注释好上几倍!
void ADOConn::OnInitADOConn()
{
::CoInitialize(NULL);
// AfxOleInit();
try
{
m_pConnection.CreateInstance(__uuidof(Connection)); //"ADODB.Recordset");//问题就在这了
_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial
Catalog=HrMan;Data Source=BB";
//Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data
Source=BB
// m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=HrMan";
// m_pConnection->Open("","","",adConnectUnspecified);
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("连接有问题");//
AfxMessageBox(e.Description());
}
}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox("查询有错误");
AfxMessageBox(e.Description());
}
return m_pRecordset;
}
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
//OnInitADOConn
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox("插入有问题");
AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize();
}
四、对数据库操作的过程:
1、定义ADOCONN对象
2、执行SQL语句
3、关闭连接
关于这一步可以参照以下代码理解,这是一个INSERT语句的执行过程:
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
vSQL="INSERT INTO Employees(Dep_Name,Sex,Title,Wage,Dep_id)VALUES('"+m_EmpName+"','"+strSex+"','"+m_Title+"','"+strWage+"',1)";
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
五、控件与ADO访问的区别:
控件的访问只是对数据进行输出,而并没有对之旱灾行具体的操作、而ADO是对数据旱灾行操作而不对之进行显示,二者结合能很好地实现VC中使用数据库。
六、心得:
这是我用了近三周的时间所理解的,真的很慢,但是我真是学到了一些东西,虽然我也知我以上总结的有很多不足,但我会坚持下去的,我会用一定的时间对VC进行全面学了,这只是一个开始。万事开头难,我相信随着知识的增加我以后会以更快的速度学,以更高效的方法向VC进军,以后我的BLOG会陆续记录我的学习总结,我也相信在大家的帮助下我的总结会越写越好!谢谢你们的批评指正!