ADO ( 问数据库数据 的编程 接口)
- ADO (ActiveX Data Objects)
- ADO有三个智能指针:_ConnectionPtr连接对象 、_RecordsetPtr记录集对象、_CommandPtr命令对象
- 先创建SQL记录集,从记录集中提取数据;
- step1:引入ADO类(在 StdAfx.h 中加入)
1 /*忽略ADO的警告*/ 2 #pragma warning(disable: 4146) 3 #pragma warning(disable: 4244) 4 5 /*ADO需要导入的库*/ 6 #import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" no_namespace rename("EOF","adoEOF") //有些数据库可能安装在D盘,路径要自己修改
- step2:初始化COM组件
- 在MFC中可以用AfxOleInit();
- 非MFC环境中用:
CoInitialize(NULL);
CoUnInitialize();
1 CTestAdoApp theApp;//创建COM组件,退出COM组件 2 ///////////////////////////////////////////////////////////////////////////// 3 // CTestAdoApp initialization 4 5 BOOL CTestAdoApp::InitInstance() 6 { 7 AfxEnableControlContainer(); 8 CoInitialize(NULL); //第二步 单线程方式创建COM组件 9 。。。 10 } 11 ... 12 int CTestAdoApp::ExitInstance() 13 { 14 // TODO: Add your specialized code here and/or call the base class 15 CoUninitialize();//最后一步 ADO COM 释放 16 return CWinApp::ExitInstance(); 17 }
/////////////////////////////////
if ( !AfxOleInit() )
{
AfxMessageBox( " OLE fail! ");
return false;
}
/////////////////////////////////
- step3:初始化数据库连接
1 ////////////////////////////////////////////////////////////////////////// 2 m_pConn.CreateInstance("ADODB.Connection"); 3 if(m_pConn==NULL)//CoInitialize£¨NULL£©Î´³õʼ»¯ 4 { 5 TRACE("初始化连接对象失败\n"); 6 return FALSE; 7 } 8 HRESULT res=-1; 9 ////////////////////////////////////////////////////////////////////////// 10 CString m_strInEdit; 11 12 GetPrivateProfileString("SQLLINK","ServerPZ","",m_strInEdit.GetBuffer(MAX_PATH),MAX_PATH,".\\config.ini"); 13 m_strInEdit.ReleaseBuffer(); 14 if (!m_strInEdit.IsEmpty()) 15 { 16 int iLen =m_strInEdit.GetLength(); 17 18 for(int i=0;i<iLen;i++) 19 { 20 m_strInEdit.SetAt(i,m_strInEdit[i]-1); 21 } 22 m_strInEdit.MakeReverse(); 23 } 24 ////////////////////////////////////////////////////////////////////////// 25 try 26 { 27 CString Sqlstr; 28 //TRACE(m_strInEdit); 29 Sqlstr =m_strInEdit; 30 res = m_pConn->Open((_bstr_t)Sqlstr,"","",0);//´ò¿ª 31 if(res==S_OK)//0 32 { 33 TRACE("打开数据库成功!"); 34 } 35 else 36 { 37 TRACE("打开数据库失败!"); 38 return FALSE; 39 } 40 } 41 catch(_com_error e) 42 { 43 CString errormessage; 44 errormessage.Format("错误信息:%s",e.ErrorMessage()); 45 AfxMessageBox(errormessage); 46 ShellExecute(NULL,"open",".\\sqlLink.exe","config.ini",NULL,SW_SHOW); 47 return FALSE; 48 }
- 另附: ADO Recordset 对象中的updateBatch函数的使用方法
1.设置 pRecord->CursorLocation = adUseClient;
2.open方法中设置lockType 为adLockBatchOptimistic
1 _RecordsetPtr pRecord; 2 pRecord.CreateInstance("ADODB.Recordset"); 3 4 pRecord->CursorLocation = adUseClient; 5 6 CString strSQL ; 7 strSQL.Append("SELECT * fROM emp "); 8 9 try 10 { 11 pRecord->Open(_bstr_t(strSQL),pConnection.GetInterfacePtr(),adOpenStatic,adLockBatchOptimistic,adCmdText); 12 13 CString strValue; 14 while(!pRecord->AdoEOF) 15 { 16 strValue.Format("Test_%d",pRecord->AbsolutePosition); 17 pRecord->PutCollect("name",_variant_t(strValue)); 18 pRecord->MoveNext(); 19 } 20 21 pRecord->UpdateBatch(adAffectAll); 22 pRecord->Close(); 23 } 24 catch(_com_error &e) 25 { 26 OutputDebugString(e.Description()); 27 }
----------------------------------------------------------------------------------------------------------------------------------------------------------------
用DirectShow到了枚举设备,放在程序开始出,没有任何输出结果,查代码发现用的:
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &p->pICreateDevEnum);
返回值居然错误,才恍然大悟,原来是没有初始化COM组件。
加上:
CoInitializeEx(NULL,COINIT_MULTITHREADED|COINIT_SPEED_OVER_MEMORY);
一切正常:)
顺便查了下:
CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是 程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
有哪些方式呢?单线程和多线程。
CoInitialize 指明以单线程方式创建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
创 建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。
在使用中,使用CoInitialize创建可使对 象直接与线程连接,得到最高的性能。创建多线程对象可以直接接收所有线程的调用,不必像单线程那样需要消息排队,但却需要COM创建线程间汇集代理,这样 访问效率不高。
注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,一般是在 Dll 中使用 COM 才会需要使用的。

浙公网安备 33010602011771号