ADO的_RecordsetPtr类中的OPEN()函数如何使用

nanc0917 2010-09-26 06:49:43
  
_RecordsetPtr m_pRec;
m_pRec->Open("SELECT * FROM 地址",

_variant_t((IDispatch*)m_pCon,true),

adOpenStatic,

adLockOptimistic,

adCmdText);


能否根据例子说明下。
...全文
312 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-09-27
  • 打赏
  • 举报
回复
[Quote]Open 方法 (ADO Recordset)
打开游标。

语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
参数
Source
可选。Variant,计算有效的 Command 对象、SQL 语句、表名、存储过程调用、URL 或包含持久存储 Recordset 的文件名或 Stream 对象。
ActiveConnection
可选。Variant,计算有效的 Connection 对象变量名,或包含 ConnectionString 参数的 String。
CursorType
可选。CursorTypeEnum 值,确定在打开 Recordset 时提供者应使用的游标类型。默认值为 adOpenForwardOnly。
LockType
可选。LockTypeEnum 值,确定在打开 Recordset 时提供者应使用的锁定(并发)类型。默认值为 adLockReadOnly。
Options
可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND 操作符组合。
注意 如果从包含持久 Recordset 的 Stream 中打开 Recordset,那么使用 adAsyncFetchNonBlocking 的 ExecuteOptionEnum 值将不起作用;提取操作将同步进行并发生阻塞。
adExecuteNoRecords 或 adExecuteStream 的 ExecuteOpenEnum 值不应与 Open 一起使用。
说明
ADO Recordset 的默认游标是位于服务器上的仅向前的只读游标。

在 Recordset 对象上使用 Open 方法打开游标,该游标表示基本表中的记录、查询的结果或以前保存的 Recordset。

使用可选的 Source 参数指定数据源,这些数据源使用下列之一:Command 对象变量、SQL 语句、存储过程、表名、URL 或完整的文件路径名。如果 Source 是文件路径名,它可以是完整路径(“c:\dir\file.rst”)、相对路径(“..\file.rst”)或 URL(“http://files/file.rst”)。

最好不要使用 Open 方法的 Source 参数执行操作查询,由于很难确定调用是否成功,所以该查询不返回记录。由此类查询所返回的 Recordset 将被关闭。调用 Command 对象的 Execute 方法或 Connection 对象的 Execute 方法,而不要执行无返回记录的查询(如 SQL INSERT 语句)。

ActiveConnection 参数与 ActiveConnection 属性相对应,指定打开 Recordset 对象的连接。如果传递此参数的连接定义,ADO 将用指定的参数打开新连接。使用客户端游标 (CursorLocation = adUseClient) 打开 Recordset 之后,可以更改此属性的值,以将更新发送到其他提供者。或者,可以将此属性设置为 Nothing(在 Microsoft Visual Basic 中)或 NULL,以断开 Recordset 与任何提供者的的连接。但是,更改服务器端游标的 ActiveConnection 将产生错误。

对于与 Recordset 对象的属性直接对应的其他参数(Source、CursorType 和 LockType),参数与属性的关系如下:

在打开 Recordset 对象之前,属性为读/写。
除非在执行 Open 方法时传递相应的参数,否则将使用属性设置。如果传递一个参数,那么该参数将覆盖相应的属性设置,并用参数值更新属性设置。
在打开 Recordset 对象之后,这些属性将变为只读。
注意 对于 Source 属性设置为有效 Command 对象的 Recordset 对象,即使 Recordset 对象未打开,ActiveConnection 属性也为只读。
如果同时传递 Source 参数中的 Command 对象和 ActiveConnection 参数,将产生错误。Command 对象的 ActiveConnection 属性必须已被设置为有效的 Connection 对象或连接字符串。

如果传递除 Source 参数中的 Command 对象之外的某些对象,则可以使用 Options 参数优化 Source 参数的计算。如果未定义 Options 参数,系统性能将会降低,因为 ADO 必须调用提供者来确定该参数是 SQL 语句、存储过程、URL 还是表名。如果知道正在使用的 Source 类型,则设置 Options 参数可以提示 ADO 直接跳到相关的代码。如果 Options 参数与 Source 类型不符,将产生错误。

如果传递 Source 参数中的 Stream 对象,不应将信息传递到其他参数;否则将产生错误。从 Stream 中打开 Recordset 时不会保留 ActiveConnection 信息。

如果没有与 Recordset 相关联的连接,Options 参数的默认值将为 adCmdFile。对于持久存储的 Recordset 对象,通常就是这种情况。

如果数据源不返回记录,提供者将把 BOF 和 EOF 属性都设为 True,并取消定义当前记录位置。如果游标类型允许,仍可以将新数据添加给这个空的 Recordset 对象。

当结束了对打开的 Recordset 对象的操作时,请使用 Close 方法释放所有相关的系统资源。关闭对象并不是将其从内存中删除,将来还可以更改其属性设置和用 Open 方法再次打开。若要从内存中彻底删除对象,请将对象变量设置为 Nothing。

在设置 ActiveConnection 属性之前,调用没有操作数的 Open 可以创建 Recordset 的实例,这些 Recordset 是通过将字段追加到 Recordset 的 Fields 集合中创建的。

如果已将 CursorLocation 属性设置为 adUseClient,则可用两种方法中的任何一种以异步方式来检索行。建议将 Options 设置为 adAsyncFetch。另外,可以使用 Properties 集合中的“Asynchronous Rowset Processing”动态属性,但是,如果不将 Options 参数设置为 adAsyncFetch,可能会丢失相关的检索事件。

[/Quote]

[Quote]
CursorTypeEnum
指示 Recordset 对象中所用游标的类型。

常量 值 说明
adOpenDynamic 2 使用动态游标。其他用户所做的添加、更改或删除均可见,而且允许 Recordset 中的所有移动类型(如果提供者不支持书签,则书签除外)。
adOpenForwardOnly 0 默认值。使用仅向前游标。除了在记录中只能向前滚动外,与静态游标相同。当只需要在 Recordset 中进行一个传递时,用它可提高性能。
adOpenKeyset 1 使用键集游标。尽管从您的 Recordset 不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,它和动态游标相似。其他用户所做的数据更改依然可见。
adOpenStatic 3 使用静态游标。一组记录的静态副本,可用于查找数据或生成报告。其他用户所做的添加、更改或删除不可见。
adOpenUnspecified -1 不指定游标类型。

ADO/WFC 等价内容

包:com.ms.wfc.data

常量
AdoEnums.CursorType.DYNAMIC
AdoEnums.CursorType.FORWARDONLY
AdoEnums.CursorType.KEYSET
AdoEnums.CursorType.STATIC
AdoEnums.CursorType.UNSPECIFIED

[/Quote]


[Quote]
LockTypeEnum
指定在编辑过程中记录上的锁定类型。

常量 值 说明
adLockBatchOptimistic 4 指示开放式批更新。需要批更新模式。
adLockOptimistic 3 指示逐个记录开放式锁定。提供者使用开放式锁定,仅在调用 Update 方法时锁定记录。
adLockPessimistic 2 指示逐个记录保守式锁定。提供者要确保记录编辑成功,通常在编辑之后立即在数据源锁定记录。
adLockReadOnly 1 指示只读记录。无法改变数据。
adLockUnspecified -1 未指定锁定类型。创建副本时,副本与源对象使用相同的锁定类型。

ADO/WFC 等价内容

包:com.ms.wfc.data

常量
AdoEnums.LockType.BATCHOPTIMISTIC
AdoEnums.LockType.OPTIMISTIC
AdoEnums.LockType.PESSIMISTIC
AdoEnums.LockType.READONLY
AdoEnums.LockType.UNSPECIFIED

[/Quote]
ACMAIN_CHM 2010-09-27
  • 打赏
  • 举报
回复
Open 和 Close 方法范例 (VC++)
本范例在已打开的 Recordset 和 Connection 对象上使用 Open 和 Close 方法。

// BeginOpenCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

#include <oledb.h>
#include <stdio.h>
#include <conio.h>
#include "OpenX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
// //
// Main Function //
// //
///////////////////////////////////////////////////////////

void main()
{
if(FAILED(::CoInitialize(NULL)))
return;

OpenX();

::CoUninitialize();
}

///////////////////////////////////////////////////////////
// //
// OpenX Function //
// //
///////////////////////////////////////////////////////////

void OpenX(void)
{
// Define ADO object pointers.
// Initialize pointers on define.
// These are in the ADODB:: namespace
_RecordsetPtr pRstEmployee = NULL;
_ConnectionPtr pConnection = NULL;

// Define string variables.
_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
"Initial Catalog='pubs';Integrated Security='SSPI';");

// Define Other Variables.
HRESULT hr = S_OK;
IADORecordBinding *picRs = NULL; // Interface Pointer declared.
CEmployeeRs emprs; // C++ Class object
DBDATE varDate;

try
{
// open connection and record set
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open(strCnn,"","",adConnectUnspecified);

TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
pRstEmployee->Open("Employee",
_variant_t((IDispatch *)pConnection,true), adOpenKeyset,
adLockOptimistic, adCmdTable);

// Open an IADORecordBinding interface pointer which we'll
// use for Binding Recordset to a class.
TESTHR(pRstEmployee->QueryInterface(
__uuidof(IADORecordBinding),(LPVOID*)&picRs));

//Bind the Recordset to a C++ Class here.
TESTHR(picRs->BindToRecordset(&emprs));

// Assign the first employee record's hire date
// to a variable, then change the hire date.
varDate = emprs.m_sze_hiredate;
printf("\nOriginal data\n");
printf("\tName - Hire Date\n");
printf(" %s %s - %d/%d/%d\n\n",
emprs.le_fnameStatus == adFldOK ?
emprs.m_sze_fname : "<NULL>",
emprs.le_lnameStatus == adFldOK ?
emprs.m_sze_lname : "<NULL>",
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.month : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.day : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.year : 0);

emprs.m_sze_hiredate.year=1900;
emprs.m_sze_hiredate.month=1;
emprs.m_sze_hiredate.day=1;
picRs->Update(&emprs);

printf("\nChanged data\n");
printf("\tName - Hire Date\n");
printf(" %s %s - %d/%d/%d\n\n",
emprs.le_fnameStatus == adFldOK ?
emprs.m_sze_fname : "<NULL>",
emprs.le_lnameStatus == adFldOK ?
emprs.m_sze_lname : "<NULL>",
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.month : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.day : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.year : 0);

// Requery Recordset and reset the hire date.
pRstEmployee->Requery(adOptionUnspecified);
// Open an IADORecordBinding interface pointer which we'll
// use for Binding Recordset to a class.
TESTHR(pRstEmployee->QueryInterface(
__uuidof(IADORecordBinding),(LPVOID*)&picRs));

// Rebind the Recordset to a C++ Class here.
TESTHR(picRs->BindToRecordset(&emprs));
emprs.m_sze_hiredate = varDate;
picRs->Update(&emprs);
printf("\nData after reset\n");
printf("\tName - Hire Date\n");
printf(" %s %s - %d/%d/%d",emprs.le_fnameStatus == adFldOK ?
emprs.m_sze_fname : "<NULL>",
emprs.le_lnameStatus == adFldOK ?
emprs.m_sze_lname : "<NULL>",
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.month : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.day : 0,
emprs.le_hiredateStatus == adFldOK ?
emprs.m_sze_hiredate.year : 0);
}
catch(_com_error &e)
{
// Notify the user of errors if any.
// Pass a connection pointer accessed from the Connection.
PrintProviderError(pConnection);
PrintComError(e);
}

// Clean up objects before exit.
if (pRstEmployee)
if (pRstEmployee->State == adStateOpen)
pRstEmployee->Close();
if (pConnection)
if (pConnection->State == adStateOpen)
pConnection->Close();
}

///////////////////////////////////////////////////////////
// //
// PrintProviderError Function //
// //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection's Error collection.
ErrorPtr pErr = NULL;

if( (pConnection->Errors->Count) > 0)
{
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount -1.
for(long i = 0;i < nCount;i++)
{
pErr = pConnection->Errors->GetItem(i);
printf("\t Error number: %x\t%s", pErr->Number,
pErr->Description);
}
}
}

///////////////////////////////////////////////////////////
// //
// PrintComError Function //
// //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());

// Print COM errors.
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}
// EndOpenCpp

OpenX.h:

// BeginOpenH
#include "icrsint.h"

// This Class extracts only fname,lastname and
// hire_date from employee table
class CEmployeeRs : public CADORecordBinding
{

BEGIN_ADO_BINDING(CEmployeeRs)

// Column fname is the 2nd field in the table
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
sizeof(m_sze_fname), le_fnameStatus, FALSE)

// Column lname is the 4th field in the table.
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
sizeof(m_sze_lname), le_lnameStatus, FALSE)

// Column hiredate is the 8th field in the table.
ADO_VARIABLE_LENGTH_ENTRY2(8, adDBDate,m_sze_hiredate,
sizeof(m_sze_hiredate), le_hiredateStatus, TRUE)

END_ADO_BINDING()

public:
CHAR m_sze_fname[21];
ULONG le_fnameStatus;
CHAR m_sze_lname[31];
ULONG le_lnameStatus;
DBDATE m_sze_hiredate;
ULONG le_hiredateStatus;
};
// EndOpenH

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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