从《EVC高级编程及其应用开发》这本书上摘抄的,好歹能用
HRESULT hr = NOERROR;
ISSCERDA* pCERDA = NULL;
BSTR bStr = NULL;
BSTR bConnectStr = NULL;
BSTR bQueryStr = NULL;
BSTR bLocalConnectStr = NULL;
BSTR bLocalTableName = NULL;
BSTR bErrorTableName = NULL;
RDA_TRACKOPTION trackOption = TRACKINGOFF;
ISSCERDA* pCERDA = NULL;
BSTR bStr = NULL;
BSTR bConnectStr = NULL;
BSTR bQueryStr = NULL;
BSTR bLocalConnectStr = NULL;
BSTR bLocalTableName = NULL;
BSTR bErrorTableName = NULL;
RDA_TRACKOPTION trackOption = TRACKINGOFF;
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED );
//一定要先初始化COM接口
hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID *)&pCERDA);
ASSERT(hr == S_OK);
ASSERT(pCERDA != NULL);
//设置Internet URL
bStr = SysAllocString(_T("http://主机地址/虚拟路径/sscesa20.dll"));
hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID *)&pCERDA);
ASSERT(hr == S_OK);
ASSERT(pCERDA != NULL);
//设置Internet URL
bStr = SysAllocString(_T("http://主机地址/虚拟路径/sscesa20.dll"));
//主机地址一定要用IP地址,不要用计算机名
pCERDA->put_InternetURL(bStr);
SysFreeString(bStr);
pCERDA->put_InternetURL(bStr);
SysFreeString(bStr);
//设置Internet userName
bStr = SysAllocString(_T(""));
pCERDA->put_InternetLogin(bStr);
SysFreeString(bStr);
bStr = SysAllocString(_T(""));
pCERDA->put_InternetLogin(bStr);
SysFreeString(bStr);
//设置Internet password
bStr = SysAllocString(_T(""));
pCERDA->put_InternetPassword(bStr);
SysFreeString(bStr);
bStr = SysAllocString(_T(""));
pCERDA->put_InternetPassword(bStr);
SysFreeString(bStr);
trackOption = TRACKINGOFF;
//设置错误表名
bErrorTableName = SysAllocString(_T("tblErrors"));
//设置服务器连接串
bConnectStr = SysAllocString(_T("provider=sqloledb; data source=主机地址; Initial Catalog=数据库名; user id=sa; password=123"));
bErrorTableName = SysAllocString(_T("tblErrors"));
//设置服务器连接串
bConnectStr = SysAllocString(_T("provider=sqloledb; data source=主机地址; Initial Catalog=数据库名; user id=sa; password=123"));
//最好SQL Server设置为SQL Server与Windows共同验证的模式并且设置一个密码
//设置本地数据库连接串
bLocalConnectStr = SysAllocString(_T("Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=//My Documents//PDA上的数据库名称.sdf"));
//设置本地数据库连接串
bLocalConnectStr = SysAllocString(_T("Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=//My Documents//PDA上的数据库名称.sdf"));
//首先需要运用事先在PDA上安装好的Isqlw20.exe创建一个空的数据库,注意不要创建表,否则会出错;而且最好创建后注意一下是否有后缀名sdf。
pCERDA->put_LocalConnectionString(bLocalConnectStr);
SysFreeString(bStr);
//设置本地表名
bLocalTableName = SysAllocString(本地表名);
pCERDA->put_LocalConnectionString(bLocalConnectStr);
SysFreeString(bStr);
//设置本地表名
bLocalTableName = SysAllocString(本地表名);
//这个表事先一定是不存在的,否则出错
//9、设置查询的SQL语句
bQueryStr = SysAllocString(_T("select * from SQL Server上的表名"));
//9、设置查询的SQL语句
bQueryStr = SysAllocString(_T("select * from SQL Server上的表名"));
//获取服务器数据
hr = pCERDA->Pull(bLocalTableName, bQueryStr, bConnectStr, trackOption,bErrorTableName);
SysFreeString(bLocalTableName);
SysFreeString(bQueryStr);
SysFreeString(bConnectStr);
SysFreeString(bErrorTableName);
if (SUCCEEDED(hr))
{
AfxMessageBox(_T("OK"));
}
else
{
ISSCEErrors *pISSCEErrors = NULL;
if(SUCCEEDED(hr = pCERDA->get_ErrorRecords(&pISSCEErrors)))
{
ShowErrors(pISSCEErrors);//这个方便查找错误,下面列出
pISSCEErrors->Release();
}
}
//释放远程访问接口
pCERDA->Release();
void ShowErrors(ISSCEErrors* pISSCEErrors)
{
HRESULT hr;
LONG cbBuf;
LONG i;
LONG lErrorCount;
LONG lErrorIndex;
LONG lParamCount;
LONG lParamIndex;
VARIANT var;
VARIANT varParam;
WCHAR wszBuff[4096];
WCHAR* pwszBuffPos = &wszBuff[0];
BSTR bstr;
ISSCEError* pISSCEError = NULL;
ISSCEParams* pISSCEParams = NULL;
ISSCEParam* pISSCEParam = NULL;
BOOL fSuccess = FALSE;
//初始化变量
VariantInit(&var);
VariantInit(&varParam);
//通过IISSCEErrors接口得到发生错误的数量
if(FAILED(hr = pISSCEErrors->get_Count(&lErrorCount)))
goto Exit;
if (lErrorCount <= 0)
{
::MessageBox(NULL, L"没有错误信息",L"显示错误", MB_OK);
fSuccess = TRUE;
goto Exit;
}
//用弹出对话框显示每一条发生的错误
for (lErrorIndex = 0; lErrorIndex < lErrorCount; lErrorIndex++)
{
cbBuf = swprintf(pwszBuffPos, L"ERROR %d of %d/r/n",
lErrorIndex+1, lErrorCount);
pwszBuffPos += cbBuf;
//得到错误记录
var.vt = VT_I4;
var.lVal = lErrorIndex;
if(FAILED(hr = pISSCEErrors->get_Item(var, &pISSCEError))) goto Exit;
//得到错误详细信息
if (FAILED(hr = pISSCEError->get_Description(&bstr))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"DESCRIPTION: '%s'/r/n", bstr);
pwszBuffPos += cbBuf;
SysFreeString(bstr);
//错误信息编号
if (FAILED(hr = pISSCEError->get_Number(&i))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"NUMBER: %8.8X/r/n", i);
pwszBuffPos += cbBuf;
//本地错误
if (FAILED(hr = pISSCEError->get_NativeError(&i))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"NATIVE_ERROR: %d/r/n", i);
pwszBuffPos += cbBuf;
//得到错误源
if (FAILED(hr = pISSCEError->get_Source(&bstr))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"SOURCE: '%s'/r/n", bstr);
pwszBuffPos += cbBuf;
SysFreeString(bstr);
//得到错误参数信息
if (FAILED(hr = pISSCEError->get_Params(&pISSCEParams))) goto Exit;
//得到错误参数的个数
if (FAILED(hr = pISSCEParams->get_Count(&lParamCount))) goto Exit;
//显示每一个参数
for (lParamIndex = 0; lParamIndex < lParamCount; lParamIndex++)
{
//得到错误参数对象
var.vt = VT_I4;
var.lVal = lParamIndex;
if (FAILED(hr = pISSCEParams->get_Item(var, &pISSCEParam))) goto Exit;
//得到并显示错误参数值
if (FAILED(hr = pISSCEParam->get_Param(&varParam))) goto Exit;
if (VT_I4 == varParam.vt || VT_UI4 == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: %d/r/n", lParamIndex,
(LONG) varParam.lVal);
}
else if (VT_I2 == varParam.vt || VT_UI2 == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: %d/r/n", lParamIndex,
(LONG) varParam.iVal);
}
else if (VT_BSTR == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: '%s'/r/n", lParamIndex,
varParam.bstrVal);
}
pwszBuffPos += cbBuf;
//清空参数变量
VariantClear(&varParam);
//释放参数对象
pISSCEParam->Release();
pISSCEParam = NULL;
}
cbBuf = swprintf(pwszBuffPos, L"/r/n");
pwszBuffPos += cbBuf;
}
//用弹出框显示错误信息
::MessageBox(NULL, wszBuff,L"Error", MB_OK);
fSuccess = TRUE;
Exit:
// 释放错误参数对象
if (pISSCEParam)
{
pISSCEParam->Release();
pISSCEParam = NULL;
}
//释放错误参数集对象
if (pISSCEParams)
{
pISSCEParams->Release();
pISSCEParams = NULL;
}
//释放错误对象
if (pISSCEError)
{
pISSCEError->Release();
pISSCEError = NULL;
}
//如果获取错误信息失败
if (!fSuccess)
{
::MessageBox(NULL, L"得到错误信息失败!",L"显示错误", MB_OK);
}
return;
}
{
HRESULT hr;
LONG cbBuf;
LONG i;
LONG lErrorCount;
LONG lErrorIndex;
LONG lParamCount;
LONG lParamIndex;
VARIANT var;
VARIANT varParam;
WCHAR wszBuff[4096];
WCHAR* pwszBuffPos = &wszBuff[0];
BSTR bstr;
ISSCEError* pISSCEError = NULL;
ISSCEParams* pISSCEParams = NULL;
ISSCEParam* pISSCEParam = NULL;
BOOL fSuccess = FALSE;
//初始化变量
VariantInit(&var);
VariantInit(&varParam);
//通过IISSCEErrors接口得到发生错误的数量
if(FAILED(hr = pISSCEErrors->get_Count(&lErrorCount)))
goto Exit;
if (lErrorCount <= 0)
{
::MessageBox(NULL, L"没有错误信息",L"显示错误", MB_OK);
fSuccess = TRUE;
goto Exit;
}
//用弹出对话框显示每一条发生的错误
for (lErrorIndex = 0; lErrorIndex < lErrorCount; lErrorIndex++)
{
cbBuf = swprintf(pwszBuffPos, L"ERROR %d of %d/r/n",
lErrorIndex+1, lErrorCount);
pwszBuffPos += cbBuf;
//得到错误记录
var.vt = VT_I4;
var.lVal = lErrorIndex;
if(FAILED(hr = pISSCEErrors->get_Item(var, &pISSCEError))) goto Exit;
//得到错误详细信息
if (FAILED(hr = pISSCEError->get_Description(&bstr))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"DESCRIPTION: '%s'/r/n", bstr);
pwszBuffPos += cbBuf;
SysFreeString(bstr);
//错误信息编号
if (FAILED(hr = pISSCEError->get_Number(&i))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"NUMBER: %8.8X/r/n", i);
pwszBuffPos += cbBuf;
//本地错误
if (FAILED(hr = pISSCEError->get_NativeError(&i))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"NATIVE_ERROR: %d/r/n", i);
pwszBuffPos += cbBuf;
//得到错误源
if (FAILED(hr = pISSCEError->get_Source(&bstr))) goto Exit;
cbBuf = swprintf(pwszBuffPos, L"SOURCE: '%s'/r/n", bstr);
pwszBuffPos += cbBuf;
SysFreeString(bstr);
//得到错误参数信息
if (FAILED(hr = pISSCEError->get_Params(&pISSCEParams))) goto Exit;
//得到错误参数的个数
if (FAILED(hr = pISSCEParams->get_Count(&lParamCount))) goto Exit;
//显示每一个参数
for (lParamIndex = 0; lParamIndex < lParamCount; lParamIndex++)
{
//得到错误参数对象
var.vt = VT_I4;
var.lVal = lParamIndex;
if (FAILED(hr = pISSCEParams->get_Item(var, &pISSCEParam))) goto Exit;
//得到并显示错误参数值
if (FAILED(hr = pISSCEParam->get_Param(&varParam))) goto Exit;
if (VT_I4 == varParam.vt || VT_UI4 == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: %d/r/n", lParamIndex,
(LONG) varParam.lVal);
}
else if (VT_I2 == varParam.vt || VT_UI2 == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: %d/r/n", lParamIndex,
(LONG) varParam.iVal);
}
else if (VT_BSTR == varParam.vt)
{
cbBuf = swprintf(pwszBuffPos, L"P%d: '%s'/r/n", lParamIndex,
varParam.bstrVal);
}
pwszBuffPos += cbBuf;
//清空参数变量
VariantClear(&varParam);
//释放参数对象
pISSCEParam->Release();
pISSCEParam = NULL;
}
cbBuf = swprintf(pwszBuffPos, L"/r/n");
pwszBuffPos += cbBuf;
}
//用弹出框显示错误信息
::MessageBox(NULL, wszBuff,L"Error", MB_OK);
fSuccess = TRUE;
Exit:
// 释放错误参数对象
if (pISSCEParam)
{
pISSCEParam->Release();
pISSCEParam = NULL;
}
//释放错误参数集对象
if (pISSCEParams)
{
pISSCEParams->Release();
pISSCEParams = NULL;
}
//释放错误对象
if (pISSCEError)
{
pISSCEError->Release();
pISSCEError = NULL;
}
//如果获取错误信息失败
if (!fSuccess)
{
::MessageBox(NULL, L"得到错误信息失败!",L"显示错误", MB_OK);
}
return;
}