m_pRecordset->CursorLocation=adUseClient; 这句话是什么意思啊,有什么用啊?

xyc6838 2004-07-26 01:55:27
如题
...全文
850 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangl79 2004-07-29
  • 打赏
  • 举报
回复
如果自己更新,用什么游标都能达到目的。
crystal_heart 2004-07-28
  • 打赏
  • 举报
回复
道理很简单,比如你打开一个新闻网页,放在那里一整天,明天再来看还是一样的东西。
实际上网上的东西已经变了。

是你自己不更新的,不能怪谁去。
yangl79 2004-07-27
  • 打赏
  • 举报
回复
M_F_C(维生素C)
如果用服务器端游标,就能同步服务器的记录了?为什么我不行,我用记录集对象查询一次数据库后,以后不管什么时候再读时它都不再变化,而服务器的数据早就变了。
内存泄漏 2004-07-27
  • 打赏
  • 举报
回复
大数据量操作的时候都是用的服务器端游标。
M_F_C 2004-07-26
  • 打赏
  • 举报
回复
游标类型为客户端游标,简单的说就类似取出一个记录集,就断开了,服务器的记录再发生了变化,当前的记录集也不能同步的。
hahu 2004-07-26
  • 打赏
  • 举报
回复
同上,
个人的想法是
adUseClient是需要把数据传输到本地,应用举例是断开数据库进行Recordset操作
参考
How To Create ADO Disconnected Recordsets in ASP Using VBScript and JScript
http://support.microsoft.com/default.aspx?scid=kb;en-us;289531

adUseServer是直接在数据库中进行操作,下面这个例子在数据量大的时候,进行Find操作,比adUseClient省了很多时间,
http://support.microsoft.com/default.aspx?scid=kb;en-us;199304
下面是转换成C++以后的代码,自己试验一下

#import "c:\\program files\\common files\\system\\ado\\msado15.dll" rename("EOF","IsEOF") rename("BOF","IsBOF")
#import "c:\\program files\\common files\\system\\ado\\msadox.dll" rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")

// ADOCursorLocation.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

#define DB_PATH "M:\\VC++\\Demos\\ShortCode\\ADOCursorLocation\\AdoCursorLocation.mdb"
#define RECORD_COUNT 250000

void CreateJetDB();
void CursorLocationTimed();

int main(int argc, char* argv[])
{
::CoInitialize(NULL);
CreateJetDB();
CursorLocationTimed();
::CoUninitialize();
return 0;
}

void CreateJetDB()
{
ADOX::_CatalogPtr pCatalog;
ADODB::_ConnectionPtr pConnection;
ADODB::_RecordsetPtr pRecordset;
int i,numRecord;
string strTmp = "";
_variant_t var;
try
{
numRecord = RECORD_COUNT;
pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
pConnection.CreateInstance(__uuidof(ADODB::Connection));
pRecordset.CreateInstance(__uuidof(ADODB::Recordset));
//CFile::Remove(lpPath);
_bstr_t bstrPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
bstrPath += DB_PATH;//strPath.c_str();
pCatalog->Create(bstrPath);
pConnection->Provider = "Microsoft.Jet.OLEDB.4.0";
pConnection->Open(DB_PATH,"","",-1);
pConnection->Execute("CREATE TABLE tblSequential (col1 long, col2 text(75));",&var,ADODB::adCmdText);
pRecordset->Open("tblSequential",pConnection.GetInterfacePtr(),ADODB::adOpenDynamic,
ADODB::adLockOptimistic,ADODB::adCmdTableDirect);
char buffer[20];
for(i = 0; i < numRecord; i++)
{
pRecordset->AddNew();
strTmp = "value";
memset(&buffer,0,sizeof(buffer));
itoa(i,(char*)&buffer,10);
strTmp += buffer;
pRecordset->PutCollect(_variant_t("col1"),_variant_t((long)i));
pRecordset->PutCollect(_variant_t("col2"),_variant_t(strTmp.c_str()));
pRecordset->Update();
}
pRecordset->Close();
pConnection->Execute("CREATE INDEX idxSeqInt on tblSequential (col1, col2);",&var,ADODB::adCmdText);
pConnection->Close();
pCatalog.Release();
pConnection.Release();
pRecordset.Release();
pCatalog = NULL;
pConnection = NULL;
pRecordset = NULL;
}
catch(_com_error &e)
{
printf(e.ErrorMessage());
}
}

void CursorLocationTimed()
{
ADODB::_ConnectionPtr pConnection;
ADODB::_RecordsetPtr pRecordset;
int i;
DWORD time;
string strTmp = "";
char buffer[20];
try
{
pConnection.CreateInstance(__uuidof(ADODB::Connection));
pRecordset.CreateInstance(__uuidof(ADODB::Recordset));
pConnection->Provider = "Microsoft.Jet.OLEDB.4.0";
pConnection->Open(DB_PATH,"","",-1);

/***--- CursorLocation = adUseServer ---***/
pRecordset->CursorLocation = ADODB::adUseServer;
time = GetTickCount();
pRecordset->Open("tblSequential",pConnection.GetInterfacePtr(),ADODB::adOpenDynamic,
ADODB::adLockOptimistic,ADODB::adCmdTableDirect);
for(i = 0; i < 1000/*RECORD_COUNT*/; i++ )
{
strTmp = "col1=";
memset(&buffer,0,sizeof(buffer));
itoa(i,(char*)&buffer,10);
strTmp += buffer;
pRecordset->Find(strTmp.c_str(),0,ADODB::adSearchForward);
}
time = GetTickCount() - time;
printf("Sequential Find + Open (Server) = %d\n",time);
pRecordset->Close();

/***--- CursorLocation = adUseClient ---***/
pRecordset->CursorLocation = ADODB::adUseClient;
time = GetTickCount();
pRecordset->Open("tblSequential",pConnection.GetInterfacePtr(),ADODB::adOpenDynamic,
ADODB::adLockOptimistic,ADODB::adCmdTableDirect);
for(i = 0; i < 1000/*RECORD_COUNT*/; i++ )
{
strTmp = "col1=";
memset(&buffer,0,sizeof(buffer));
itoa(i,(char*)&buffer,10);
strTmp += buffer;
pRecordset->Find(strTmp.c_str(),0,ADODB::adSearchForward);
}
time = GetTickCount() - time;
printf("Sequential Find + Open (Client) = %d\n",time);
pRecordset->Close();


pConnection->Close();
pConnection.Release();
pRecordset.Release();
pConnection = NULL;
pRecordset = NULL;

}
catch(_com_error &e)
{
printf(e.ErrorMessage());
}
}
Kudeet 2004-07-26
  • 打赏
  • 举报
回复
选择游标类型为客户端

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧