以前用ODBC用的多,现在想改用ADO了.本人在建立了一个单文档应用程序后,插入一个对话框(我将这个对话框声明为CDepartment类),再对话框中添加了两个编辑框,(平时用ODBC方式的时候,就只需要将想要的数据库表导入工程后,注册后就能用了,很简单),但是现在改用ADO方式试试.(我要用到的数据库是ACCESS类型的,用的是Classes.mdb,数据表是"Department".它包含"Department Code"和"Department Name"两个字段,上面已经添加了两个对话框,我的目的就是要在这两个编辑框内分别显示它们)
请各位大虾帮忙看看对不对;
(1)我先在stdafx.h中加入 #import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "adoEOF")(2)然后我在APP类的INITINSTANCE中添加如下代码:(事先已经声明好了_ConnnectionPtr ADOConn和_RecordsetPtr m_pADOSet指针) CoInitialize(NULL);
ADOConn.CreateInstance(__uuidof(Connection)); try
{
ADOConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Classes.mdb","","",adModeUnknown);
}
catch(_com_error &e)
{
CString err;
err.Format("%s",(char*)(e.Description()));
AfxMessageBox("err");
catch(...)
{
AfxMessageBox("Unknown Error");
}m_pADOSet.CreateInstance(__uuidof(Recordset));
try
{
m_pADOSet->Open("Department",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error &e)
{
CString err;
err.Format("ADO Error:%s",(char*)e.Description());
AfzMessageBox(err);
return false;
}
}(3)接着我在APP类中,重载系统提供的ExitInstance()函数,填写如下代码: if(adStateOpen==ADOConn->State) ADOConn->Close();
ADOConn.Release(); if(adStateOpen==m_pADOSet->State) m_pADOSet->Close();
m_pADOSet.Release();
return CWinApp::ExitInstance();下面我就要请问各位大虾了,我要在之前对话框上添加的两个编辑框控间上显示数据表的两个记录集
,接下来的代码该如何写?如果以上我写的代码有错误的地方请更正,多谢了.感激不禁
请各位大虾帮忙看看对不对;
(1)我先在stdafx.h中加入 #import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "adoEOF")(2)然后我在APP类的INITINSTANCE中添加如下代码:(事先已经声明好了_ConnnectionPtr ADOConn和_RecordsetPtr m_pADOSet指针) CoInitialize(NULL);
ADOConn.CreateInstance(__uuidof(Connection)); try
{
ADOConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Classes.mdb","","",adModeUnknown);
}
catch(_com_error &e)
{
CString err;
err.Format("%s",(char*)(e.Description()));
AfxMessageBox("err");
catch(...)
{
AfxMessageBox("Unknown Error");
}m_pADOSet.CreateInstance(__uuidof(Recordset));
try
{
m_pADOSet->Open("Department",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error &e)
{
CString err;
err.Format("ADO Error:%s",(char*)e.Description());
AfzMessageBox(err);
return false;
}
}(3)接着我在APP类中,重载系统提供的ExitInstance()函数,填写如下代码: if(adStateOpen==ADOConn->State) ADOConn->Close();
ADOConn.Release(); if(adStateOpen==m_pADOSet->State) m_pADOSet->Close();
m_pADOSet.Release();
return CWinApp::ExitInstance();下面我就要请问各位大虾了,我要在之前对话框上添加的两个编辑框控间上显示数据表的两个记录集
,接下来的代码该如何写?如果以上我写的代码有错误的地方请更正,多谢了.感激不禁
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);---------------------------
m_pADOSet->Open("select * from Department",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
1.stdafx.h里添加:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")#pragma warning(disable:4146)2.添加App类的成员函数:
_ConnectionPtr m_pConnection;3.App类的InitInstance()函数里添加如下代码
::CoInitialize(NULL);
m_strConnection = _T("Driver=SQL Server;Database=master;Server=你的sql服务名;UID=用户名;PWD=密码;");HRESULT hRes;
try
{
hRes = m_pConnection.CreateInstance(_T("ADODB.Connection"));
m_pConnection->ConnectionTimeout = 8;
hRes = m_pConnection->Open(_bstr_t((LPCTSTR)m_strConnection),
_T(""),_T(""),adModeUnknown);
}
catch(_com_error e)
{
CString strMsg;
strMsg.Format(_T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
AfxMessageBox(strMsg);
return FALSE;
}4.执行sql代码
CString strDbName;
CString strSQL = "select name from master.dbo.sysdatabases";
try
{
m_pRecordset1.CreateInstance("ADODB.Recordset");
m_pRecordset1->Open((LPTSTR)strSQL.GetBuffer(130),
_variant_t((IDispatch *)(((COracleAssistApp*)AfxGetApp())->m_pConnection),true),
adOpenDynamic,adLockPessimistic,adCmdText);
if(!m_pRecordset1->BOF )
{
m_pRecordset1->MoveFirst();
while(!m_pRecordset1->adoEOF)
{
//取结果集
strDbName = VariantToCString(m_pTreeRecordset->GetCollect("Name"));
m_pRecordset1->MoveNext ();
}
}
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("%s",e.ErrorInfo());
MessageBox("errormessage!",strFieldValue,MB_ICONWARNING);
}5.上面取结果集的部分用到一个函数VariantToCString,是用来将VARIANT型变量转为CString的CString VariantToCString(VARIANT var)
{
CString strValue;
_variant_t var_t;
_bstr_t bst_t;
time_t cur_time;
CTime time_value;
COleCurrency var_currency;
switch(var.vt)
{
case VT_EMPTY:
strValue=_T("");
break;
case VT_UI1:
strValue.Format("%d",var.bVal);
break;
case VT_I2:
strValue.Format("%d",var.iVal);
break;
case VT_I4:
strValue.Format("%d",var.lVal);
break;
case VT_R4:
strValue.Format("%f",var.fltVal);
break;
case VT_R8:
strValue.Format("%f",var.dblVal);
break;
case VT_CY:
var_currency=var;
strValue=var_currency.Format(0);
break;
case VT_BSTR:
var_t=var;
bst_t=var_t;
strValue.Format ("%s",(const char*)bst_t);
break;
case VT_NULL:
strValue=_T("");
break;
case VT_DATE:
cur_time = (long)var.date;
time_value=cur_time;
strValue=time_value.Format("%A,%B%d,%Y");
break;
case VT_BOOL:
strValue.Format("%d",var.boolVal );
break;
default:
strValue=_T("");
break;
}
return strValue;
}