EVC 读取多行记录和读取多列字段

本文展示了一个使用 SQL Server Compact Edition (SQLCE) 进行数据访问的具体示例,包括初始化数据库、创建会话、打开行集、获取数据等过程,并演示了如何处理错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//一次取多行数据
 HRESULT hr;
 ISSCERDA* pCERDA = NULL;
 IDBInitialize   *pIDBInitialize = NULL;
 IDBCreateSession   *pIDBCreateSession = NULL;
 IDBProperties   *pIDBProperties = NULL;
 IOpenRowset *pIOpenRowset = NULL;
 IRowset *pIRowset = NULL;
 DBPROP   dbprop[1];
 DBPROPSET   dbpropset[1];
 IUnknown *pIUnknown = NULL;
 IDBCreateCommand *pIDBCreateCommand = NULL;
 ICommandText *pICommandText = NULL;
 IAccessor* pIAccessor = NULL;
 HACCESSOR hAccessor = DB_NULL_HACCESSOR;
 DBBINDING *prgBinding = NULL;
 DBCOLUMNINFO *pDBColumnInfo = NULL;
 BYTE *pData = NULL;
 IColumnsInfo *pIColumnsInfo = NULL;

 BSTR bStr = NULL;
 BSTR bConnectStr = NULL;
 BSTR bQueryStr = NULL;
 BSTR bLocalConnectStr = NULL;
 BSTR bLocalTableName = NULL;
 WCHAR *pStringsBuffer = NULL;
 WCHAR *pwszName = NULL; 

 HROW* prghRows = NULL;
    ULONG cRowsObtained;
 DWORD dwOffset = 0;
 DWORD dwBindingSize = 0;
 DWORD dwIndex = 0;
 DWORD dwOrdinal = 0;
 ULONG ulNumCols = 0;

 WCHAR* pwszEmployees[] = { L"GOODS_ID" };

 hr = CoInitialize();
 if(FAILED(hr))return FALSE;

 hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID *)&pCERDA);
 ASSERT(hr == S_OK);
 ASSERT(pCERDA != NULL);

 TCHAR sqlIP[128];
 _tcscpy(sqlIP,_T("http://192.168.1.155/sqlce/sscesa20.dll"));
 bStr = sqlIP;
 pCERDA->put_InternetURL(bStr);

 bStr = _T("");
 pCERDA->put_InternetLogin(bStr);

 bStr = _T("");
 pCERDA->put_InternetPassword(bStr);

 TCHAR sql[256];
 _tcscpy(sql,_T("Provider=sqloledb;Data Source=192.168.1.155;Initial Catalog=WMS;User Id=WMS"));
 _tcscat(sql,_T(";Password=wms"));
 bConnectStr = sql;

// TCHAR buffer[128];
 TCHAR sqlinfo[256];
 _tcscpy(sqlinfo,_T("SELECT GOODS_ID FROM T_GDN_DTL WHERE GDN_NUM = '00000001'"));

 pCERDA->put_LocalConnectionString(_T("Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\\My Documents\\wms.sdf"));
 bLocalTableName = _T("qtt");

 bQueryStr = sqlinfo;
 hr = pCERDA->Pull(bLocalTableName, bQueryStr, bConnectStr, TRACKINGOFF, NULL);

 if (FAILED(hr))
 {
  ISSCEErrors *pISSCEErrors = NULL;
  if(SUCCEEDED(hr = pCERDA->get_ErrorRecords(&pISSCEErrors)))
  {
//   ShowErrors(pISSCEErrors);
   pISSCEErrors->Release();
  }
 }
 pCERDA->Release();

 VariantInit(&dbprop[0].vValue);

 hr = CoCreateInstance( CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);
 if(FAILED(hr))
  goto Exit;

    dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
 dbprop[0].dwOptions  = DBPROPOPTIONS_REQUIRED;
    dbprop[0].vValue.vt  = VT_BSTR;
    dbprop[0].vValue.bstrVal= SysAllocString(_T("\\My Documents\\wms.sdf"));
 if(NULL == dbprop[0].vValue.bstrVal)
 {
  hr = E_OUTOFMEMORY;
  goto Exit;
 }

 dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
 dbpropset[0].rgProperties  = dbprop;
 dbpropset[0].cProperties  = sizeof(dbprop)/sizeof(dbprop[0]);

 hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
    if(FAILED(hr))
  goto Exit;

    hr = pIDBProperties->SetProperties(1, dbpropset);
 if(FAILED(hr))
  goto Exit;

 hr = pIDBInitialize->Initialize();//表不存在
 if(FAILED(hr))
  goto Exit;

   hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession);
 if(FAILED(hr))
  goto Exit;

 hr = pIDBCreateSession->CreateSession(NULL, IID_IOpenRowset, (IUnknown**) &pIOpenRowset);
    if(FAILED(hr))
        goto Exit;

 DBID TableID;
 TableID.eKind = DBKIND_NAME;
 TableID.uName.pwszName = _T("qtt");

 DBPROPSET rowsetpropset[1];
 DBPROP rowsetprop[1];

 rowsetpropset[0].cProperties = 1;
 rowsetpropset[0].guidPropertySet= DBPROPSET_ROWSET;
 rowsetpropset[0].rgProperties = rowsetprop;

 rowsetprop[0].dwPropertyID  = DBPROP_IRowsetIndex;
 rowsetprop[0].dwOptions   = DBPROPOPTIONS_REQUIRED;
 rowsetprop[0].colid    = DB_NULLID;
 rowsetprop[0].vValue.vt   = VT_BOOL;
 rowsetprop[0].vValue.boolVal = VARIANT_TRUE;

 hr = pIOpenRowset->OpenRowset( NULL, &TableID, NULL, IID_IRowset,
         sizeof(rowsetpropset)/sizeof(rowsetpropset[0]),
         rowsetpropset,
         (IUnknown**) &pIRowset);

 if(FAILED(hr))
  goto Exit;

 hr = pIRowset->QueryInterface(IID_IColumnsInfo, (void **)&pIColumnsInfo);
 if(FAILED(hr))
  goto Exit;

    hr = pIColumnsInfo->GetColumnInfo(&ulNumCols, &pDBColumnInfo, &pStringsBuffer);
 if(FAILED(hr) || 0 == ulNumCols)
  goto Exit;

 dwBindingSize = sizeof(pwszEmployees)/sizeof(pwszEmployees[0]);
 prgBinding = (DBBINDING*)CoTaskMemAlloc(sizeof(DBBINDING)*dwBindingSize);
 if (NULL == prgBinding)
 {
  hr = E_OUTOFMEMORY;
  goto Exit;
 }

 dwOffset = 0;

    for (dwIndex = 0; dwIndex < dwBindingSize; ++dwIndex)
    {
  if (!GetColumnOrdinal(pDBColumnInfo, ulNumCols, pwszEmployees[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;
  }

  dwOffset = prgBinding[dwIndex].obValue + prgBinding[dwIndex].cbMaxLen;
  dwOffset = ROUND_UP(dwOffset, 1);
 }

 hr = pIRowset->QueryInterface(IID_IAccessor, (void**)&pIAccessor);
 if(FAILED(hr))
  goto Exit;

 hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, dwBindingSize, prgBinding, 0, &hAccessor, NULL);
 if(FAILED(hr))
  goto Exit;

 pData = (BYTE*)CoTaskMemAlloc(dwOffset);
 if (NULL == pData)
 {
  hr = E_OUTOFMEMORY;
  goto Exit;
 }

 pwszName = (WCHAR*)CoTaskMemAlloc(prgBinding[0].cbMaxLen + 1);
 if (NULL == pwszName)
 {
  hr = E_OUTOFMEMORY;
  goto Exit;
 }

 while (1) {
  hr = pIRowset->GetNextRows (0, 0, 1, &cRowsObtained, &prghRows);//一行行取出数据  
  if (hr == 265926 || FAILED(hr)) break;     //数据结尾  
  hr = pIRowset->GetData(prghRows[0], hAccessor, pData);
  if (FAILED(hr))
  {
   pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
   goto Exit;
  }
  
  TCHAR szSqlQuantity[128];
  
  if (DBSTATUS_S_ISNULL != *(DBSTATUS *)(pData+prgBinding[0].obStatus))
   wcscpy(szSqlQuantity, (WCHAR*)(pData+prgBinding[0].obValue));
  
  hr = pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
  if(FAILED(hr))
   goto Exit;
  
  if (prghRows)
  {
   CoTaskMemFree(prghRows);
   prghRows = NULL;
  }
 }

 /*While(SUCCEEDED(hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 100, &cRowsObtained, &prghRows))   &&         cRowsObtained)    
 {  
  for(irow   =   0;   irow   <   cRowsObtained;   irow++)    
  {  
   //   GetData   copies   the   rows   into   the   local   buffers,   performing   the  
   //   type   conversions   specified   in   the   binding   structures   associated  
   //   with   the   accessor.  
   pRowset->GetData(rghRows[irow],   hAccessor,   (void*)   rgData);  
   
   //   Set   currently   read   row   as   "current   row."  
   //   Note:   Other   clients   will   choose   different   notions  
   //   of   current   row.  
   If   (pIRowPosition->ClearRowPosition   ()   ==   S_OK)  
    pIRowPosition->SetRowPosition   (NULL,   rghRows[irow],  
    DBPOSITION_OK);  
   
   //   Convenience   function   to   print   the   data  
   PrintData(rgData);  
  }    
        //   Release   the   rows   just   printed   from   the   rowset.  
        PRowset->ReleaseRows(cRowsObtained,   rghRows,   NULL,   NULL,   NULL);  
        }*/
 /*hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, &prghRows); //如果有数据
 if(FAILED(hr) || hr == 265926)
 {
  goto Exit;
 }
 else
 {
  memset(pData, 0, dwOffset);
  
  hr = pIRowset->GetData(prghRows[0], hAccessor, pData);
  if (FAILED(hr))
  {
   pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
   goto Exit;
  }

  TCHAR szSqlQuantity[128];
  
  if (DBSTATUS_S_ISNULL != *(DBSTATUS *)(pData+prgBinding[0].obStatus))
   wcscpy(szSqlQuantity, (WCHAR*)(pData+prgBinding[0].obValue));
  
  hr = pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
  if(FAILED(hr))
   goto Exit;
  
  if (prghRows)
  {
   CoTaskMemFree(prghRows);
   prghRows = NULL;
  }
 }*/

 //删除表
 pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL);

 VariantClear(&rowsetprop[0].vValue);

 if (prghRows)
 {
        CoTaskMemFree(prghRows);
        prghRows = NULL;
 }

    if (prgBinding)
    {
        CoTaskMemFree(prgBinding);
        prgBinding = NULL;
    }

    if (pDBColumnInfo)
    {
        CoTaskMemFree(pDBColumnInfo);
        pDBColumnInfo = NULL;
    }
 
    if (pStringsBuffer)
    {
        CoTaskMemFree(pStringsBuffer);
        pStringsBuffer = NULL;
    }

 if (pData)
 {
        CoTaskMemFree(pData);
  pData = NULL;
 }

 if (pwszName)
 {
  CoTaskMemFree(pwszName);
  pwszName = NULL;
 }

 if(pIAccessor)
 {
  pIAccessor->ReleaseAccessor(hAccessor, NULL);
  pIAccessor->Release();
 }

 if (pIColumnsInfo)
 {
  pIColumnsInfo->Release();
 }

 if(pIRowset)
  pIRowset->Release();

 if(pIOpenRowset)
  pIOpenRowset->Release();

 hr = pIDBCreateSession->CreateSession(NULL,IID_IUnknown,&pIUnknown);
 if(FAILED(hr))
  goto Exit;

 hr = pIUnknown->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
 if(FAILED(hr))
  goto Exit;

 hr = pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
 if(FAILED(hr))
  goto Exit;

 hr = pICommandText->SetCommandText(DBGUID_SQL,_T("DROP TABLE qtt"));
 if(FAILED(hr))
  goto Exit;

 hr = pICommandText->Execute(NULL,IID_NULL,NULL,NULL,NULL);
 if(FAILED(hr))
  goto Exit;

 if(pICommandText)
  pICommandText->Release();

 if(pIDBCreateCommand)
  pIDBCreateCommand->Release();

 if(pIUnknown)
  pIUnknown->Release();

 if(pIDBCreateSession)
  pIDBCreateSession->Release();

 if(pIDBProperties)
  pIDBProperties->Release();

 if(pIDBInitialize)
  pIDBInitialize->Release();

 CoUninitialize();

 return TRUE;
Exit:
 //删除表
 pCERDA->Release();

 VariantClear(&rowsetprop[0].vValue);

 if (prghRows)
 {
        CoTaskMemFree(prghRows);
        prghRows = NULL;
 }

    if (prgBinding)
    {
        CoTaskMemFree(prgBinding);
        prgBinding = NULL;
    }

    if (pDBColumnInfo)
    {
        CoTaskMemFree(pDBColumnInfo);
        pDBColumnInfo = NULL;
    }
 
    if (pStringsBuffer)
    {
        CoTaskMemFree(pStringsBuffer);
        pStringsBuffer = NULL;
    }

 if (pData)
 {
        CoTaskMemFree(pData);
  pData = NULL;
 }

 if (pwszName)
 {
  CoTaskMemFree(pwszName);
  pwszName = NULL;
 }

 if(pIAccessor)
 {
  pIAccessor->ReleaseAccessor(hAccessor, NULL);
  pIAccessor->Release();
 }

 if (pIColumnsInfo)
 {
  pIColumnsInfo->Release();
 }

 if(pIRowset)
  pIRowset->Release();

 if(pIOpenRowset)
  pIOpenRowset->Release();

 pIDBCreateSession->CreateSession(NULL,IID_IUnknown,&pIUnknown);

 pIUnknown->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);

 pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);

 pICommandText->SetCommandText(DBGUID_SQL,_T("DROP TABLE qtt"));

 pICommandText->Execute(NULL,IID_NULL,NULL,NULL,NULL);

 if(pICommandText)
  pICommandText->Release();

 if(pIDBCreateCommand)
  pIDBCreateCommand->Release();

 if(pIUnknown)
  pIUnknown->Release();

 if(pIDBCreateSession)
  pIDBCreateSession->Release();

 if(pIDBProperties)
  pIDBProperties->Release();

 if(pIDBInitialize)
  pIDBInitialize->Release();

 CoUninitialize();

 return FALSE;

 

//一次取多列数据
 HRESULT hr;
 ISSCERDA* pCERDA = NULL;
 IDBInitialize   *pIDBInitialize = NULL;
 IDBCreateSession   *pIDBCreateSession = NULL;
 IDBProperties   *pIDBProperties = NULL;
 IOpenRowset *pIOpenRowset = NULL;
 IRowset *pIRowset = NULL;
 DBPROP   dbprop[1];
 DBPROPSET   dbpropset[1];
 IUnknown *pIUnknown = NULL;
 IDBCreateCommand *pIDBCreateCommand = NULL;
 ICommandText *pICommandText = NULL;
 IAccessor* pIAccessor = NULL;
 HACCESSOR hAccessor = DB_NULL_HACCESSOR;
 DBBINDING *prgBinding = NULL;
 DBCOLUMNINFO *pDBColumnInfo = NULL;
 BYTE *pData = NULL;
 IColumnsInfo *pIColumnsInfo = NULL;

 BSTR bStr = NULL;
 BSTR bConnectStr = NULL;
 BSTR bQueryStr = NULL;
 BSTR bLocalConnectStr = NULL;
 BSTR bLocalTableName = NULL;
 WCHAR *pStringsBuffer = NULL;
 WCHAR *pwszName = NULL; 

 HROW* prghRows = NULL;
    ULONG cRowsObtained;
 DWORD dwOffset = 0;
 DWORD dwBindingSize = 0;
 DWORD dwIndex = 0;
 DWORD dwOrdinal = 0;
 ULONG ulNumCols = 0;
 TCHAR sql[256] = TEXT("");

 WCHAR* pwszEmployees[] = { L"QUANTITY",L"SAP_STK" };

 hr = CoInitialize();
 if(FAILED(hr))return;
 
 VariantInit(&dbprop[0].vValue);
 
 hr = CoCreateInstance( CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("CoCreateInstance Error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
    dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
 dbprop[0].dwOptions  = DBPROPOPTIONS_REQUIRED;
    dbprop[0].vValue.vt  = VT_BSTR;
    dbprop[0].vValue.bstrVal= SysAllocString(_T("\\My Documents\\wms.sdf")); //_T("\\My Documents\\wms.sdf");
 
 if(NULL == dbprop[0].vValue.bstrVal)
 {
  hr = E_OUTOFMEMORY;
  MessageBox(hWnd,_T("dbprop Error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
 dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
 dbpropset[0].rgProperties  = dbprop;
 dbpropset[0].cProperties  = sizeof(dbprop)/sizeof(dbprop[0]);
 
 hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
    if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIDBInitialize QueryInterface error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
    hr = pIDBProperties->SetProperties(1, dbpropset);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIDBProperties SetProperties error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
 hr = pIDBInitialize->Initialize();//表不存在
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIDBInitialize Initialize error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
 hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIDBInitialize QueryInterface error!"),_T("提示"),MB_OK);
  goto Exit;
 }
 
 pIDBCreateSession->CreateSession(NULL,IID_IUnknown,&pIUnknown);
 
 pIUnknown->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
 
 pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
 
 pICommandText->SetCommandText(DBGUID_SQL,_T("DROP TABLE stk"));
 
 pICommandText->Execute(NULL,IID_NULL,NULL,NULL,NULL);
 
 if(pICommandText)
  pICommandText->Release();
 
 if(pIDBCreateCommand)
  pIDBCreateCommand->Release();
 
 if(pIUnknown)
  pIUnknown->Release();

 hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID *)&pCERDA);
 ASSERT(hr == S_OK);
 ASSERT(pCERDA != NULL);

 TCHAR sqlIP[128];
 _tcscpy(sqlIP,_T("http://192.168.1.155/sqlce/sscesa20.dll"));
 bStr = sqlIP;
 pCERDA->put_InternetURL(bStr);

 bStr = _T("");
 pCERDA->put_InternetLogin(bStr);

 bStr = _T("");
 pCERDA->put_InternetPassword(bStr);

 _tcscpy(sql,_T("Provider=sqloledb;Data Source=192.168.1.155;Initial Catalog=WMS;User Id=WMS"));
 _tcscat(sql,_T(";Password=wms"));
 bConnectStr = sql;

 TCHAR sqlinfo[256];
 _tcscpy(sqlinfo,_T("SELECT CAST(STK_ON_HAND AS varchar) AS QUANTITY,CAST(SAP_STK AS varchar) AS SAP_STK FROM T_WAREH_GOODS WHERE "));
 _tcscat(sqlinfo,_T("GOODS_ID = '"));
 _tcscat(sqlinfo,_T("A001-0401-001012"));
 _tcscat(sqlinfo,_T("' AND WAREH_ID = '"));
 _tcscat(sqlinfo,_T("0001"));
 _tcscat(sqlinfo,_T("'"));

 pCERDA->put_LocalConnectionString(_T("Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\\My Documents\\wms.sdf"));
 bLocalTableName = _T("stk");

 bQueryStr = sqlinfo;
 hr = pCERDA->Pull(bLocalTableName, bQueryStr, bConnectStr, TRACKINGOFF, NULL);

 if (FAILED(hr))
 {
  ISSCEErrors *pISSCEErrors = NULL;
  if(SUCCEEDED(hr = pCERDA->get_ErrorRecords(&pISSCEErrors)))
  {
   //ShowErrors(pISSCEErrors);
   pISSCEErrors->Release();
   goto Exit;
  }
 }
 pCERDA->Release();
 pCERDA = NULL;

 hr = pIDBCreateSession->CreateSession(NULL, IID_IOpenRowset, (IUnknown**) &pIOpenRowset);
    if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIDBCreateSession CreateSession error!"),_T("提示"),MB_OK);
        goto Exit;
 }

 DBID TableID;
 TableID.eKind = DBKIND_NAME;
 TableID.uName.pwszName = _T("stk");

 DBPROPSET rowsetpropset[1];
 DBPROP rowsetprop[1];

 rowsetpropset[0].cProperties = 1;
 rowsetpropset[0].guidPropertySet= DBPROPSET_ROWSET;
 rowsetpropset[0].rgProperties = rowsetprop;

 rowsetprop[0].dwPropertyID  = DBPROP_IRowsetIndex;
 rowsetprop[0].dwOptions   = DBPROPOPTIONS_REQUIRED;
 rowsetprop[0].colid    = DB_NULLID;
 rowsetprop[0].vValue.vt   = VT_BOOL;
 rowsetprop[0].vValue.boolVal = VARIANT_TRUE;

 hr = pIOpenRowset->OpenRowset( NULL, &TableID, NULL, IID_IRowset,
         sizeof(rowsetpropset)/sizeof(rowsetpropset[0]),
         rowsetpropset,
         (IUnknown**) &pIRowset);

 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIOpenRowset OpenRowset error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 hr = pIRowset->QueryInterface(IID_IColumnsInfo, (void **)&pIColumnsInfo);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIRowset QueryInterface error!"),_T("提示"),MB_OK);
  goto Exit;
 }

    hr = pIColumnsInfo->GetColumnInfo(&ulNumCols, &pDBColumnInfo, &pStringsBuffer);
 if(FAILED(hr) || 0 == ulNumCols)
 {
  MessageBox(hWnd,_T("pIColumnsInfo GetColumnInfo error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 dwBindingSize = sizeof(pwszEmployees)/sizeof(pwszEmployees[0]);
 prgBinding = (DBBINDING*)CoTaskMemAlloc(sizeof(DBBINDING)*dwBindingSize);
 if (NULL == prgBinding)
 {
  hr = E_OUTOFMEMORY;
  MessageBox(hWnd,_T("prgBinding CoTaskMemAlloc error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 dwOffset = 0;

    for (dwIndex = 0; dwIndex < dwBindingSize; ++dwIndex)
    {
  if (!GetColumnOrdinal(pDBColumnInfo, ulNumCols, pwszEmployees[dwIndex], &dwOrdinal))
  {
   hr = E_FAIL;
   MessageBox(hWnd,_T("GetColumnOrdinal error!"),_T("提示"),MB_OK);
   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;
  }

  dwOffset = prgBinding[dwIndex].obValue + prgBinding[dwIndex].cbMaxLen;
  dwOffset = ROUND_UP(dwOffset, 1);
 }

 hr = pIRowset->QueryInterface(IID_IAccessor, (void**)&pIAccessor);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIRowset QueryInterface error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, dwBindingSize, prgBinding, 0, &hAccessor, NULL);
 if(FAILED(hr))
 {
  MessageBox(hWnd,_T("pIAccessor CreateAccessor error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 pData = (BYTE*)CoTaskMemAlloc(dwOffset);
 if (NULL == pData)
 {
  hr = E_OUTOFMEMORY;
  MessageBox(hWnd,_T("pData CoTaskMemAlloc error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 pwszName = (WCHAR*)CoTaskMemAlloc(prgBinding[0].cbMaxLen + 1);
 if (NULL == pwszName)
 {
  hr = E_OUTOFMEMORY;
  MessageBox(hWnd,_T("pwszName CoTaskMemAlloc error!"),_T("提示"),MB_OK);
  goto Exit;
 }

 hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, &prghRows); //如果有数据
 if(FAILED(hr) || hr == 265926)
 {
  goto Exit;
 }
 else
 {
  memset(pData, 0, dwOffset);
  
  hr = pIRowset->GetData(prghRows[0], hAccessor, pData);
  if (FAILED(hr))
  {
   pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
   MessageBox(hWnd,_T("pIRowset GetData error!"),_T("提示"),MB_OK);
   goto Exit;
  }
  
  if (DBSTATUS_S_ISNULL != *(DBSTATUS *)(pData+prgBinding[0].obStatus))
  {
   wcscpy(pwszName, (WCHAR*)(pData+prgBinding[0].obValue));
   HWND hData = GetDlgItem(hWnd,IDC_EDIT_STOCKNO);
   SetWindowText(hData,pwszName);
  }

  if (DBSTATUS_S_ISNULL != *(DBSTATUS *)(pData+prgBinding[1].obStatus))
  {
   wcscpy(pwszName, (WCHAR*)(pData+prgBinding[1].obValue));
   HWND hData = GetDlgItem(hWnd,IDC_EDIT_STOCKNO2);
   SetWindowText(hData,pwszName);
  }
  
  hr = pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
  if(FAILED(hr))
  {
   MessageBox(hWnd,_T("pIRowset ReleaseRows error!"),_T("提示"),MB_OK);
   goto Exit;
  }
  
  if (prghRows)
  {
   CoTaskMemFree(prghRows);
   prghRows = NULL;
  }
 }

 //删除表
 pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL);

 VariantClear(&rowsetprop[0].vValue);

 if (prghRows)
 {
        CoTaskMemFree(prghRows);
        prghRows = NULL;
 }

    if (prgBinding)
    {
        CoTaskMemFree(prgBinding);
        prgBinding = NULL;
    }

    if (pDBColumnInfo)
    {
        CoTaskMemFree(pDBColumnInfo);
        pDBColumnInfo = NULL;
    }
 
    if (pStringsBuffer)
    {
        CoTaskMemFree(pStringsBuffer);
        pStringsBuffer = NULL;
    }

 if (pData)
 {
        CoTaskMemFree(pData);
  pData = NULL;
 }

 if (pwszName)
 {
  CoTaskMemFree(pwszName);
  pwszName = NULL;
 }

 if(pIAccessor)
 {
  pIAccessor->ReleaseAccessor(hAccessor, NULL);
  pIAccessor->Release();
 }

 if (pIColumnsInfo)
 {
  pIColumnsInfo->Release();
 }

 if(pIRowset)
  pIRowset->Release();

 if(pIOpenRowset)
  pIOpenRowset->Release();

 hr = pIDBCreateSession->CreateSession(NULL,IID_IUnknown,&pIUnknown);
 if(FAILED(hr))
  goto Exit;

 hr = pIUnknown->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
 if(FAILED(hr))
  goto Exit;

 hr = pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
 if(FAILED(hr))
  goto Exit;

 hr = pICommandText->SetCommandText(DBGUID_SQL,_T("DROP TABLE stk"));
 if(FAILED(hr))
  goto Exit;

 hr = pICommandText->Execute(NULL,IID_NULL,NULL,NULL,NULL);
 if(FAILED(hr))
  goto Exit;

 if(pICommandText)
  pICommandText->Release();

 if(pIDBCreateCommand)
  pIDBCreateCommand->Release();

 if(pIUnknown)
  pIUnknown->Release();

 if(pIDBCreateSession)
  pIDBCreateSession->Release();

 if(pIDBProperties)
  pIDBProperties->Release();

 if(pIDBInitialize)
  pIDBInitialize->Release();

 CoUninitialize();

 return;
Exit:
 //删除表
 if(pCERDA)
  pCERDA->Release();

 VariantClear(&rowsetprop[0].vValue);

 if (prghRows)
 {
        CoTaskMemFree(prghRows);
        prghRows = NULL;
 }

    if (prgBinding)
    {
        CoTaskMemFree(prgBinding);
        prgBinding = NULL;
    }

    if (pDBColumnInfo)
    {
        CoTaskMemFree(pDBColumnInfo);
        pDBColumnInfo = NULL;
    }
 
    if (pStringsBuffer)
    {
        CoTaskMemFree(pStringsBuffer);
        pStringsBuffer = NULL;
    }

 if (pData)
 {
        CoTaskMemFree(pData);
  pData = NULL;
 }

 if (pwszName)
 {
  CoTaskMemFree(pwszName);
  pwszName = NULL;
 }

 if(pIAccessor)
 {
  pIAccessor->ReleaseAccessor(hAccessor, NULL);
  pIAccessor->Release();
 }

 if (pIColumnsInfo)
 {
  pIColumnsInfo->Release();
 }

 if(pIRowset)
  pIRowset->Release();

 if(pIOpenRowset)
  pIOpenRowset->Release();

 pIDBCreateSession->CreateSession(NULL,IID_IUnknown,&pIUnknown);

 pIUnknown->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);

 pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);

 pICommandText->SetCommandText(DBGUID_SQL,_T("DROP TABLE stk"));

 pICommandText->Execute(NULL,IID_NULL,NULL,NULL,NULL);

 if(pICommandText)
  pICommandText->Release();

 if(pIDBCreateCommand)
  pIDBCreateCommand->Release();

 if(pIUnknown)
  pIUnknown->Release();

 if(pIDBCreateSession)
  pIDBCreateSession->Release();

 if(pIDBProperties)
  pIDBProperties->Release();

 if(pIDBInitialize)
  pIDBInitialize->Release();

 CoUninitialize();

 

BOOL 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值