//一次取多行数据
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;
}