VC++2005中操作SQLCE3.0

来源:互联网 发布:win7服务优化批处理 编辑:程序博客网 时间:2024/06/08 06:29
环境: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;}