首页>
知识库>
详情

VC与VB操作数据库的不同--ADO

2020-08-05 来源:CloudBest 阅读量: 0
关键词:

    这几天用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);