现在的位置: 首页 > 综合 > 正文

Sql Server CE的Pull操作

2012年10月22日 ⁄ 综合 ⁄ 共 5090字 ⁄ 字号 评论关闭
从《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;
 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"));
//主机地址一定要用IP地址,不要用计算机名
 pCERDA->put_InternetURL(bStr);
 SysFreeString(bStr);
 //设置Internet userName
 bStr = SysAllocString(_T(""));
 pCERDA->put_InternetLogin(bStr);
 SysFreeString(bStr);
 //设置Internet password
 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"));
//最好SQL Server设置为SQL Server与Windows共同验证的模式并且设置一个密码
 
 //设置本地数据库连接串
 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(本地表名);
//这个表事先一定是不存在的,否则出错
  
 //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;
}

抱歉!评论已关闭.