ADO数据库

mengde007 2009-02-26 07:34:32
我们常用的_RecordsetPtr类与_ConnectionPtr类他们的某些操作我有点不懂,比如说对于_ConnectionPtr类所声明的一个对象cnn,那么cnn对于数据库的操作是不是只读的,请大家多说一点,另外我对于他们的Open 操作的参数也不太了解,在网上找了半天也没有结果,大家详细一点吧!
...全文
84 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2009-02-26
  • 打赏
  • 举报
回复
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


ACMAIN_CHM 2009-02-26
  • 打赏
  • 举报
回复
Connection 对象
代表与数据源的唯一会话。在使用客户端/服务器数据库系统的情况下,该对象可以等价于与服务器的实际网络连接。Connection 对象的某些集合、方法或属性可能不可用,这取决于提供者支持的功能。

Open 方法 (ADO Connection)
打开到数据源的连接。

Open 方法 (ADO Connection)
打开到数据源的连接。

语法
connection.Open ConnectionString, UserID, Password, Options
参数
ConnectionString
可选。String 值,包含连接信息。有关有效设置的详细信息,请参阅 ConnectionString 属性。
UserID
可选。String 值,包含建立连接时要使用的用户名称。
Password
可选。String 值,包含建立连接时要使用的密码。
Options
可选。ConnectOptionEnum 值,确定应在建立连接之后(同步)还是应在建立连接之前(异步)返回本方法。
说明
使用 Connection 对象的 Open 方法建立到数据源的物理连接。当本方法成功完成后,该连接便成为有效连接,您可以对它发布命令并处理结果。

使用可选的 ConnectionString 参数指定包含一系列由分号隔开的 argument = value 语句的连接字符串,或指定用 URL 标识的文件或目录资源。ConnectionString 属性自动继承用于 ConnectionString 参数的值。因此,您既可以在打开前设置 Connection 对象的 ConnectionString 属性,也可以在调用 Open 方法过程中使用 ConnectionString 参数设置或覆盖当前连接参数。

如果同时在 ConnectionString 参数和可选的 UserID 和 Password 参数中传递用户和密码信息,那么 UserID 和 Password 参数将覆盖在 ConnectionString 中指定的值。

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

远程数据服务用法 在客户端 Connection 对象上使用 Open 方法时,只有在 Connection 对象上打开 Recordset,才会真正建立与服务器的连接。
注意 使用 http 模式的 URL 将自动调用 Microsoft OLE DB Provider for Internet Publishing。有关详细详细,请参阅绝对和相对 URL。

QQ群 48866293 / 12035577 / 7440532 / 13666209
https://forum.csdn.net/BList/OtherDatabase .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .

2,208

社区成员

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

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