从C++;Windows Server 2008的速度要慢得多 我们有一些经典的ASP调用的C++代码。它在Windows 2000上运行,并通过COM从ASP.NET中使用CreateObject调用。代码使用一个ADO记录集(服务器端),该记录集从ASP传递给它,并在记录中循环,生成一个XML文件 我们已经把C++ DLL移到了Windows 2008服务器上,速度慢了很多。使用Wireshark我们可以看到这一点,因为每次它移动到一个新记录时,它都会重新启动连接

从C++;Windows Server 2008的速度要慢得多 我们有一些经典的ASP调用的C++代码。它在Windows 2000上运行,并通过COM从ASP.NET中使用CreateObject调用。代码使用一个ADO记录集(服务器端),该记录集从ASP传递给它,并在记录中循环,生成一个XML文件 我们已经把C++ DLL移到了Windows 2008服务器上,速度慢了很多。使用Wireshark我们可以看到这一点,因为每次它移动到一个新记录时,它都会重新启动连接,c++,asp-classic,ado,windows-server-2008-r2,C++,Asp Classic,Ado,Windows Server 2008 R2,旧服务器使用ADO 2.7,新服务器使用ADO 6,但它们在功能上是等效的,据我所知,这只是版本的一个新标签 下面是代码的主体。它无法编译,因为我删除了一些位来简化结构 { STDMETHODIMP Crender::generatexmldoc(LPDISPATCH adorecordset) _Recordset rs; rs.AttachDispatch(adorecordset); CStringArray* fieldnames = new CStringAr

旧服务器使用ADO 2.7,新服务器使用ADO 6,但它们在功能上是等效的,据我所知,这只是版本的一个新标签

下面是代码的主体。它无法编译,因为我删除了一些位来简化结构

{
STDMETHODIMP Crender::generatexmldoc(LPDISPATCH adorecordset)

    _Recordset rs;
    rs.AttachDispatch(adorecordset);
    CStringArray* fieldnames = new CStringArray();
    int recno = 0;
    LPDISPATCH fs = rs.GetFields();
    while ( rs.GetState() == 1 && ! rs.GetEof() && recno++ != maxrecords) {
      _generatexmlelement(fs , arecordname, TRUE, fieldnames);
      rs.MoveNext();
    }
    fs->Release();
    rs.DetachDispatch();
    fieldnames->RemoveAll();
    delete fieldnames;
}

void Crender::_generatexmlelement(LPDISPATCH adofields, LPCSTR elementname, BOOL closeelement, CStringArray* fieldnames)
{
  USES_CONVERSION;

  if (fieldnames->GetSize() == 0) {
    for (index.uiVal = 0; index.uiVal < total; index.uiVal++) {
      LPDISPATCH dItem = fs.GetItem(index);
      fd.AttachDispatch(dItem);
      CString name = fd.GetName();
      fieldnames->Add(name);
      fd.DetachDispatch();
      dItem->Release();
    }
  }

  writeoutfile(CString("<") + elementname);
  for (index.uiVal = 0; index.uiVal < total; index.uiVal++) {
    LPDISPATCH dItem = fs.GetItem(index);
    fd.AttachDispatch(dItem);
    value.Attach(fd.GetValue());
    // code removed - data comes from value
    writeoutfile(data, data.GetLength());
    }

    value.Clear();
    value.Detach();
    fd.DetachDispatch();
    dItem->Release();
  }
}
{
STDMETHODIMP Crender::generatexmldoc(LPDISPATCH adorecordset)
_记录集;
rs.AttachDispatch(adorecordset);
CStringArray*字段名=新CStringArray();
int recno=0;
lpfs=rs.GetFields();
而(rs.GetState()==1&&!rs.GetEof()&&recno++!=maxrecords){
_generatexmlelement(fs、arecordname、TRUE、FieldName);
rs.MoveNext();
}
fs->Release();
rs.dispatch();
fieldnames->RemoveAll();
删除字段名;
}
void Crender::_generatexmlelement(LPDISPATCH adofields,LPCSTR elementname,BOOL closeelement,CStringArray*字段名)
{
使用_转换;
如果(字段名->GetSize()==0){
对于(index.uiVal=0;index.uiVal添加(名称);
fd.dispatch();
dItem->Release();
}
}

writeoutfile(CString)(“恭喜您找到了和不互斥的情况。恭喜您找到了和不互斥的情况。:D恭喜您找到了和不互斥的情况。:D