环境:vs2005+PPC5PPC端需要安装sqlce30.ppc.wce5.armv4i.CAB,sqlce30.repl.ppc.wce5.armv4i.CAB。可选安装sqlce30.dev.ENU.ppc.wce5.armv4i.CAB(查询分析器)一般在以下路径/Microsoft Visual Studio 8/SmartDevices/SDK/SQL Server/Mobile/v3.0/wce500/armv4i代码事例:/***********************************************************************dbcommon.hCopyright (c) 1999 - 2002, Microsoft CorporationAll Rights Reserved.***********************************************************************/#ifndef NORTHWIND_OLEDB_SAMPLE_QUERY_INCLUDED#define NORTHWIND_OLEDB_SAMPLE_QUERY_INCLUDED // Database name & employee table nameconst CString DATABASE_NAME = L"Gisdb.sdf";const WCHAR TABLE_TASKINFO[] = L"TaskInfo";const WCHAR SQL_CREATE_TASKINFO_TABLE[] = L"CREATE TABLE TaskInfo (TaskID NVARCHAR(26), TaskName NVARCHAR(50), TaskFlag NVARCHAR(2), TaskType NVARCHAR(10), ScoutType NVARCHAR(50), CreateDate NVARCHAR(20), StartDate NVARCHAR(20), EndDate NVARCHAR(20), Principal NVARCHAR(20), ScoutMan NVARCHAR(255),ScoutEmph NVARCHAR(255),PdaCode NVARCHAR(1000),UsePdaCode NVARCHAR(32),TaskState NVARCHAR(10),ScanType NVARCHAR(255),DeptCode NVARCHAR(30))";const WCHAR SQL_CREATE_TASKINFO_INDEX[]= L"CREATE INDEX PK_TaskInfo on TaskInfo (TaskID ASC)";#endif // NORTHWIND_OLEDB_SAMPLE_QUERY_INCLUDED/***********************************************************************OLeDbManage.hCopyright (c) 1999 - 2002, Microsoft CorporationAll Rights Reserved.***********************************************************************/#pragma once#include "ssceoledb30.h"#include "dbcommon.h"const int COLUMN_ALIGNVAL = 8; // Column alignment valueinline DWORD ROUND_UP(DWORD dwSize, DWORD dwAmount) { return ((dwSize + (dwAmount-1)) & ~(dwAmount-1));}class COLeDbManage{public: COLeDbManage(void);public: ~COLeDbManage(void);public: int InitDatabase(void); HRESULT OpenDataBase(BSTR bstrDataBase); HRESULT CreateDataBase(BSTR bstrDataBase); //执行一条SQL语句 HRESULT ExecuteSQL(ICommandText *pICmdText, WCHAR * pwszQuery); //执行一条SQL语句返回结果集 HRESULT ExecuteSQL(ICommandText *pICmdText, WCHAR * pwszQuery,IRowset *pIRowset); BOOL GetColumnOrdinal(DBCOLUMNINFO* pDBColumnInfo, DWORD dwNumCols, WCHAR* pwszColName, DWORD* pOrdinal);public: IDBCreateSession *m_pIDBCreateSession; // The IDBCreateSession interface };/***********************************************************************OLeDbManage.cppCopyright (c) 1999 - 2002, Microsoft CorporationAll Rights Reserved.***********************************************************************/#include "OLeDbManage.h"COLeDbManage::COLeDbManage(void){ //1.初始化环境 HRESULT hr=NOERROR; hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(FAILED(hr)) { AfxMessageBox(L"初始化COM环境失败",MB_OK); }}COLeDbManage::~COLeDbManage(void){ if(m_pIDBCreateSession) { HRESULT hr = NOERROR; IDBInitialize *pIDBInitialize = NULL; hr = m_pIDBCreateSession->QueryInterface(IID_IDBInitialize, (void **) &pIDBInitialize); if(SUCCEEDED(hr)) { pIDBInitialize->Uninitialize(); pIDBInitialize->Release(); } m_pIDBCreateSession->Release(); } CoUninitialize();}int COLeDbManage::InitDatabase(){ CString strDataBase = theApp.m_strRootPath + DATABASE_NAME; BSTR bstrDataBase = strDataBase.AllocSysString(); HRESULT hr = NOERROR; HANDLE hFind; WIN32_FIND_DATA FindFileData; hFind = FindFirstFile(bstrDataBase, &FindFileData); if (INVALID_HANDLE_VALUE != hFind) { FindClose(hFind); hr = OpenDataBase(bstrDataBase); } else { hr = CreateDataBase(bstrDataBase); } if(FAILED(hr)) { SysFreeString(bstrDataBase); if (hr == -2147221164 ) { AfxMessageBox(L"没有安装SQLCE3.0环境",MB_OK); } else { AfxMessageBox(L"初始化SQLCE3.0环境失败",MB_OK); } return 0; } return 1; }HRESULT COLeDbManage::OpenDataBase(BSTR bstrDataBase){ HRESULT hr = NOERROR; // Error code reporting DBPROP dbprop[1]; // property used in property set to initialize provider DBPROPSET dbpropset[1]; // Property Set used to initialize provider IDBInitialize *pIDBInitialize = NULL; // Provider Interface Pointer IDBProperties *pIDBProperties = NULL; // Provider Interface Pointer IUnknown *pIUnknownSession = NULL; // Provider Interface Pointer IDBCreateCommand *pIDBCrtCmd = NULL; // Provider Interface Pointer VariantInit(&dbprop[0].vValue); // Create an instance of the OLE DB Provider // hr = CoCreateInstance( CLSID_SQLSERVERCE_3_0, 0, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize); if(FAILED(hr)) { goto Exit; } // Initialize a property with name of database // dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE; dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED; dbprop[0].vValue.vt = VT_BSTR; dbprop[0].vValue.bstrVal= SysAllocString(bstrDataBase); if(NULL == dbprop[0].vValue.bstrVal) { hr = E_OUTOFMEMORY; goto Exit; } // Initialize the property set // dbpropset[0].guidPropertySet = DBPROPSET_DBINIT; dbpropset[0].rgProperties = dbprop; dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]); //Set initialization properties. // hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties); if(FAILED(hr)) { goto Exit; } // Sets properties in the Data Source and initialization property groups // hr = pIDBProperties->SetProperties(1, dbpropset); if(FAILED(hr)) { goto Exit; } // Initializes a data source object // hr = pIDBInitialize->Initialize(); if(FAILED(hr)) { goto Exit; } // Get IDBCreateSession interface // hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&m_pIDBCreateSession); Exit: // Clear Variant // VariantClear(&dbprop[0].vValue); // Release interfaces // if(pIDBProperties) { pIDBProperties->Release(); } if (pIDBInitialize) { pIDBInitialize->Release(); } return hr;}HRESULT COLeDbManage::CreateDataBase(BSTR bstrDataBase){ HRESULT hr = NOERROR; //创建 打开数据库的接口IID_IDBInitialize DBPROPSET dbpropset[1]; // Property Set used to initialize provider DBPROP dbprop[1]; // property array used in property set to initialize provider IDBInitialize *pIDBInitialize = NULL; // Provider Interface Pointer IDBDataSourceAdmin *pIDBDataSourceAdmin = NULL; // Provider Interface Pointer IUnknown *pIUnknownSession = NULL; // Provider Interface Pointer IDBCreateCommand *pIDBCrtCmd = NULL; // Provider Interface Pointer ICommandText *pICmdText = NULL; // Provider Interface Pointer VariantInit(&dbprop[0].vValue); hr = CoCreateInstance( CLSID_SQLSERVERCE_3_0, 0, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize); if(FAILED(hr)) { goto Exit; } // Initialize a property with name of database // dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE; dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED; dbprop[0].vValue.vt = VT_BSTR; dbprop[0].vValue.bstrVal = SysAllocString(bstrDataBase); if(NULL == dbprop[0].vValue.bstrVal) { hr = E_OUTOFMEMORY; goto Exit; } // Initialize the property set // dbpropset[0].guidPropertySet = DBPROPSET_DBINIT; dbpropset[0].rgProperties = dbprop; dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]); // Get IDBDataSourceAdmin interface // hr = pIDBInitialize->QueryInterface(IID_IDBDataSourceAdmin, (void **) &pIDBDataSourceAdmin); if(FAILED(hr)) { goto Exit; } // Create and initialize data store // hr = pIDBDataSourceAdmin->CreateDataSource(1, dbpropset, NULL, IID_IUnknown, &pIUnknownSession); if(FAILED(hr)) { goto Exit; } // Get IDBCreateSession interface // hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&m_pIDBCreateSession); if(FAILED(hr)) { goto Exit; } // Get IDBCreateCommand interface // hr = pIUnknownSession->QueryInterface(IID_IDBCreateCommand, (void**)&pIDBCrtCmd); if(FAILED(hr)) { goto Exit; } // Create a command object // hr = pIDBCrtCmd->CreateCommand(NULL, IID_ICommandText, (IUnknown**)&pICmdText); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TASKINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TASKINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_LINEINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_LINEINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_POLEINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_POLEINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TRACKINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TRACKINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_BUGINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_BUGINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TASKRESULTINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_TASKRESULTINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_SCANINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_SCANINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_SCANITEMINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_SCANITEMINFO_INDEX); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_OVERHAULINFO_TABLE); if(FAILED(hr)) { goto Exit; } hr = ExecuteSQL(pICmdText, (LPWSTR)SQL_CREATE_OVERHAULINFO_INDEX); if(FAILED(hr)) { goto Exit; } Exit: // Clear Variant // VariantClear(&dbprop[0].vValue); // Release interfaces // if(pICmdText) { pICmdText->Release(); } if(pIDBCrtCmd) { pIDBCrtCmd->Release(); } if(pIUnknownSession) { pIUnknownSession->Release(); } if(pIDBDataSourceAdmin) { pIDBDataSourceAdmin->Release(); } if(pIDBInitialize) { pIDBInitialize->Release(); } return hr;}HRESULT COLeDbManage::ExecuteSQL(ICommandText *pICmdText, WCHAR * pwszQuery){ HRESULT hr = NOERROR; hr = pICmdText->SetCommandText(DBGUID_SQL, pwszQuery); if(FAILED(hr)) { goto Exit; } hr = pICmdText->Execute(NULL, IID_NULL, NULL, NULL, NULL);Exit: return hr;}HRESULT COLeDbManage::ExecuteSQL(ICommandText *pICmdText, WCHAR * pwszQuery,IRowset *pIRowset){ HRESULT hr = NOERROR; LONG cRowsAffected = 0; hr = pICmdText->SetCommandText(DBGUID_SQL, pwszQuery); if(FAILED(hr)) { goto Exit; } hr = pICmdText->Execute(NULL, IID_IRowset, NULL, &cRowsAffected, (IUnknown**)&pIRowset); Exit: return hr;}BOOL COLeDbManage::GetColumnOrdinal(DBCOLUMNINFO* pDBColumnInfo, DWORD dwNumCols, WCHAR* pwszColName, DWORD* pOrdinal){ for(DWORD dwCol = 0; dwCol< dwNumCols; ++dwCol) { if(NULL != pDBColumnInfo[dwCol].pwszName) { if(0 == _wcsicmp(pDBColumnInfo[dwCol].pwszName, pwszColName)) { *pOrdinal = pDBColumnInfo[dwCol].iOrdinal; return TRUE; } } } return FALSE;}/***********************************************************************实现从数据库取数据(目前还没实现根据任一条SQL语句得到结果集)Copyright (c) 1999 - 2002, Microsoft CorporationAll Rights Reserved.***********************************************************************/HRESULT CDbOperator::GetTaskInfo(CArray<PW_TaskInfo,PW_TaskInfo>* pstTaskInfoArray,CString strWhere){ HRESULT hr = NOERROR; // Error code reporting DBBINDING *prgBinding = NULL; // Binding used to create accessor HROW rghRows[1]; // Array of row handles obtained from the rowset object HROW* prghRows = rghRows; // Row handle(s) pointer ULONG cRowsObtained; // Number of rows obtained from the rowset object BYTE *pData = NULL; // Record data DBCOLUMNINFO *pDBColumnInfo = NULL; // Record column metadata WCHAR *pwszName = NULL; // Record employee name DWORD dwIndex = 0; DWORD dwOffset = 0; DWORD dwBindingSize = 0; DWORD dwOrdinal = 0; ULONG ulNumCols = 0; WCHAR *pStringsBuffer = NULL; LONG lRowsAffected =0; IRowset *pIRowset = NULL; // Provider Interface Pointer IColumnsInfo *pIColumnsInfo = NULL; // Provider Interface Pointer IAccessor* pIAccessor = NULL; // Provider Interface Pointer HACCESSOR hAccessor = DB_NULL_HACCESSOR;// Accessor handle IUnknown *pIUnknownSession = NULL; // Provider Interface Pointer IDBCreateCommand *pIDBCrtCmd = NULL; // Provider Interface Pointer ICommandText *pICmdText = NULL; // Provider Interface Pointer WCHAR* pwszTaskColumn[] = { // Info to retrieve employee names L"TaskID", L"TaskName", L"TaskFlag", L"TaskType", L"ScoutType", L"CreateDate", L"StartDate", L"EndDate", L"Principal", L"ScoutMan", L"ScoutEmph", L"PdaCode", L"UsePdaCode", L"TaskState", L"ScanType" }; CString strSQL = L"select * from TaskInfo " + strWhere; BSTR bstrSQL = strSQL.AllocSysString(); // Validate IDBCreateSession interface // if (NULL == theApp.m_dbManage.m_pIDBCreateSession) { hr = E_POINTER; goto Exit; } if (NULL == pstTaskInfoArray) { hr = E_POINTER; goto Exit; } // Create a session object // hr = theApp.m_dbManage.m_pIDBCreateSession->CreateSession(NULL, IID_IUnknown, (IUnknown**) &pIUnknownSession); if(FAILED(hr)) { goto Exit; } // Get IDBCreateCommand interface // hr = pIUnknownSession->QueryInterface(IID_IDBCreateCommand, (void**)&pIDBCrtCmd); if(FAILED(hr)) { goto Exit; } // Create a command object // hr = pIDBCrtCmd->CreateCommand(NULL, IID_ICommandText, (IUnknown**)&pICmdText); if(FAILED(hr)) { goto Exit; } hr = pICmdText->SetCommandText(DBGUID_SQL, bstrSQL); if(FAILED(hr)) { SysFreeString(bstrSQL); goto Exit; } hr = pICmdText->Execute(NULL, IID_IRowset, NULL, &lRowsAffected, (IUnknown**)&pIRowset); if(FAILED(hr)) { SysFreeString(bstrSQL); goto Exit; } SysFreeString(bstrSQL); // Get IColumnsInfo interface // hr = pIRowset->QueryInterface(IID_IColumnsInfo, (void **)&pIColumnsInfo); if(FAILED(hr)) { goto Exit; } // Get the column metadata // hr = pIColumnsInfo->GetColumnInfo(&ulNumCols, &pDBColumnInfo, &pStringsBuffer); if(FAILED(hr) || 0 == ulNumCols) { goto Exit; } // Create a DBBINDING array. // dwBindingSize = sizeof(pwszTaskColumn)/sizeof(pwszTaskColumn[0]); prgBinding = (DBBINDING*)CoTaskMemAlloc(sizeof(DBBINDING)*dwBindingSize); if (NULL == prgBinding) { hr = E_OUTOFMEMORY; goto Exit; } // Set initial offset for binding position // dwOffset = 0; // Prepare structures to create the accessor // for (dwIndex = 0; dwIndex < dwBindingSize; ++dwIndex) { if (!theApp.m_dbManage.GetColumnOrdinal(pDBColumnInfo, ulNumCols, pwszTaskColumn[dwIndex], &dwOrdinal)) { hr = E_FAIL; goto Exit; } prgBinding[dwIndex].iOrdinal = dwOrdinal; prgBinding[dwIndex].dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH; prgBinding[dwIndex].obLength = dwOffset; prgBinding[dwIndex].obStatus = prgBinding[dwIndex].obLength + sizeof(ULONG); prgBinding[dwIndex].obValue = prgBinding[dwIndex].obStatus + sizeof(DBSTATUS); prgBinding[dwIndex].wType = pDBColumnInfo[dwOrdinal].wType; prgBinding[dwIndex].pTypeInfo = NULL; prgBinding[dwIndex].pObject = NULL; prgBinding[dwIndex].pBindExt = NULL; prgBinding[dwIndex].dwMemOwner = DBMEMOWNER_CLIENTOWNED; prgBinding[dwIndex].dwFlags = 0; prgBinding[dwIndex].bPrecision = pDBColumnInfo[dwOrdinal].bPrecision; prgBinding[dwIndex].bScale = pDBColumnInfo[dwOrdinal].bScale; switch(prgBinding[dwIndex].wType) { case DBTYPE_WSTR: prgBinding[dwIndex].cbMaxLen = sizeof(WCHAR)*(pDBColumnInfo[dwOrdinal].ulColumnSize + 1); // Extra buffer for null terminator break; default: prgBinding[dwIndex].cbMaxLen = pDBColumnInfo[dwOrdinal].ulColumnSize; break; } // Calculate the offset, and properly align it // dwOffset = prgBinding[dwIndex].obValue + prgBinding[dwIndex].cbMaxLen; dwOffset = ROUND_UP(dwOffset, COLUMN_ALIGNVAL); } // Get IAccessor // hr = pIRowset->QueryInterface(IID_IAccessor, (void**)&pIAccessor); if(FAILED(hr)) { goto Exit; } // Create the accessor // hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, dwBindingSize, prgBinding, 0, &hAccessor, NULL); if(FAILED(hr)) { goto Exit; } // Allocate data buffer. // pData = (BYTE*)CoTaskMemAlloc(dwOffset); if (NULL == pData) { hr = E_OUTOFMEMORY; goto Exit; } // Allocate a memory big enough to held employee name // LastName + ', ' + FirstName // pwszName = (WCHAR*)CoTaskMemAlloc(prgBinding[1].cbMaxLen + prgBinding[2].cbMaxLen + 2); if (NULL == pwszName) { hr = E_OUTOFMEMORY; goto Exit; } // Retrive a row // hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, &prghRows); while (SUCCEEDED(hr) && DB_S_ENDOFROWSET != hr) { // Set data buffer to zero // memset(pData, 0, dwOffset); // Fetch actual data hr = pIRowset->GetData(prghRows[0], hAccessor, pData); if (FAILED(hr)) { // Release the rowset. // pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL); goto Exit; } PW_TaskInfo voObject; //if (DBSTATUS_S_ISNULL != *(DBSTATUS *)(pData+prgBinding[0].obStatus)) wcscpy(voObject.TaskID, (WCHAR*)(pData+prgBinding[0].obValue)); wcscpy(voObject.TaskName, (WCHAR*)(pData+prgBinding[1].obValue)); wcscpy(voObject.TaskFlag, (WCHAR*)(pData+prgBinding[2].obValue)); wcscpy(voObject.TaskType, (WCHAR*)(pData+prgBinding[3].obValue)); wcscpy(voObject.ScoutType, (WCHAR*)(pData+prgBinding[4].obValue)); wcscpy(voObject.CreateDate, (WCHAR*)(pData+prgBinding[5].obValue)); wcscpy(voObject.StartDate, (WCHAR*)(pData+prgBinding[6].obValue)); wcscpy(voObject.EndDate, (WCHAR*)(pData+prgBinding[7].obValue)); wcscpy(voObject.Principal, (WCHAR*)(pData+prgBinding[8].obValue)); wcscpy(voObject.ScoutMan, (WCHAR*)(pData+prgBinding[9].obValue)); wcscpy(voObject.ScoutEmph, (WCHAR*)(pData+prgBinding[10].obValue)); wcscpy(voObject.PdaCode, (WCHAR*)(pData+prgBinding[11].obValue)); wcscpy(voObject.UsePdaCode, (WCHAR*)(pData+prgBinding[12].obValue)); wcscpy(voObject.TaskState, (WCHAR*)(pData+prgBinding[13].obValue)); wcscpy(voObject.ScanType, (WCHAR*)(pData+prgBinding[14].obValue)); pstTaskInfoArray->Add(voObject); // Release the rowset. // hr = pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL); if(FAILED(hr)) { goto Exit; } // Fetches next row. hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, &prghRows); }Exit: // Free allocated DBBinding memory // if (prgBinding) { CoTaskMemFree(prgBinding); prgBinding = NULL; } // Free allocated column info memory // if (pDBColumnInfo) { CoTaskMemFree(pDBColumnInfo); pDBColumnInfo = NULL; } // Free allocated column string values buffer // if (pStringsBuffer) { CoTaskMemFree(pStringsBuffer); pStringsBuffer = NULL; } // Free data record buffer // if (pData) { CoTaskMemFree(pData); pData = NULL; } // Free employee name buffer // if (pwszName) { CoTaskMemFree(pwszName); pwszName = NULL; } // Release interfaces // if(pIAccessor) { pIAccessor->ReleaseAccessor(hAccessor, NULL); pIAccessor->Release(); } if (pIColumnsInfo) { pIColumnsInfo->Release(); } if(pIRowset) { pIRowset->Release(); } if (pICmdText) pICmdText->Release(); if (pIDBCrtCmd) pIDBCrtCmd->Release(); if (pIUnknownSession) pIUnknownSession->Release(); return hr;}