这几天用VC开发了一个比较完善的信息管理程序,相对于VB的数据库程序,同是ADO访问,感觉有着很大的不同
1.数据库的连接和记录集的得到
VB的连接和查询SQL
只需要在模块中写下以下函数,而后设置rs,cn为全局变量,就可以在整个程序中使用rs来显示数据库的内容
Public Function GetDataFiles(rsSQL As String)
Dim i As Integer
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;Data Source=" & App.Path & "\ph.mdb"
cn.Open
rs.Open rsSQL, cn, adOpenKeyset, adLockOptimistic
End Function
每次只需要设置好rsSQL语句,在程序中使用GetDataFiles函数,然后使用rs不断的操作就可以得到搜索结果,每次操作完毕调用以下函数关闭
VB的退出和关闭
Public Function CloseDataFiles()
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
VC的连接
VC相对而言连接对象要麻烦一些,首先要在程序初始设置两个对象,全程序要能够访问它,为了简洁明了,我略去了程序的异常处理部分。
_ConnectionPtr m_pConnection; // 连接对象
_RecordsetPtr m_pRecordset; // 记录对象
实例化该两个对象
HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");
ASSERT(SUCCEEDED(hr));
hr = m_pRecordset.CreateInstance("ADODB.Recordset");
ASSERT(SUCCEEDED(hr));
而后连接对象,这些可以包装在一个函数内,VC最大的不同就是要用要用到_bstr_t和_variant_t来访问和获取数据库的数据,而后再转换成VC的常用数据类型
这些数据类型的转换弄好了的话,VC操作数据库和VB一样的方便和容易
_bstr_t bstrConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath;
hr = theApp.m_pConnection->Open(bstrConnection,"","",adModeUnknown);
ASSERT(SUCCEEDED(hr));
SysFreeString(bstrConnection);
VC对数据库的操作
假设bstrSQL为SQL语句,注意是_bstr_t类型
theApp.m_pRecordset->Open(bstrSQL,theApp.m_pConnection.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
其实可以看出来,VC和VB的访问和操作并无什么不同,无非VC下是对接口的操作,只要我们用函数包装的话,还是差不多的。
VC的关闭
if(m_pRecordset->State & adStateOpen)
{
m_pRecordset->Close();
}
if(m_pConnection->State & adStateOpen)
{
m_pConnection->Close();
}
m_pRecordset.Release();
m_pConnection.Release();
2.对记录集的操作
VB数据的获取
在这里说,这是VB最大的方便之处,根本无需考虑什么类型转换
只要rs.EOF为假
rs.Fields("段名")。Value 就可以取出数据
VB数据的保存
rs.Fields("段名")。Value = 值
VC数据的获取
首先VC的数据必须要转换才能使用,从数据库中得到的值类型为_variant_t,我新建一个该类型的变量var
var = theApp.m_pRecordset->GetCollect("段名");
如果得到的值为空的话,只需要判断var.vt=VT_NULL或者VT_EMPTY即可,有时候数据是否为空很重要,否则直接转换为VC的数据类型就会出错。
可以先判断其数据类型,如是否int变量可以设置为
if(var.vt & VT_I4)
如是否BSTR变量,可以设置条件语句
if(var.vt & VT_BSTR)
假设我需要的数据为long lVal,则
lVal = (long)var;
假设我需要的数据为CString strVal或者TCHAR* szVal,则
strVal = (TCHAR*)(_bstr_t)var;
或者
szVal = (TCHAR*)(_bstr_t)var;
VC数据的保存
可以直接强行保存,如已有变量_variant_t var
如果要保存数据long lVal
var = (_variant_t)lVar;
如要保存字符串strVal
var = (_bstr_t)strVal;
保存进数据库
theApp.m_pRecordset->PutCollect("段名",var);