【VC开源代码栏目提醒】:网学会员为需要VC开源代码的朋友们搜集整理了ADOWin32ConsoleTransaction.cpp相关资料,希望对各位网友有所帮助!
// ADOWin32ConsoleTransaction.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "icrsint.h"
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <assert.h>
#include <malloc.h>
//定义应用程序需求的类,以便进行记录字段的绑定
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
//绑定给定记录集的第二个字段
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szT_title,
sizeof(m_szT_title), lT_titleStatus, FALSE)
//绑定给定记录集的的第三个字段
ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szT_type,
sizeof(m_szT_type), lT_typeStatus, TRUE)
END_ADO_BINDING()
public:
CHAR m_szT_title[150];
ULONG lT_titleStatus;
CHAR m_szT_type[40];
ULONG lT_typeStatus;
};
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void BeginTransX(void);
void PrintProviderError(_ConnectionPtr pConnection);
int _tmain(int argc, _TCHAR* argv[])
{
if(FAILED(::CoInitialize(NULL)))
return 1;
BeginTransX();
printf("\nPress any key to continue...");
getch();
::CoUninitialize();
return 0;
}
void BeginTransX()
{
//定义ADO对象,缺省的在 ADODB:: 命名空间
_RecordsetPtr rstTitles = NULL;
_ConnectionPtr pConnection = NULL;
HRESULT hr = S_OK;
IADORecordBinding *picRs = NULL;
CTitlesRs titlrs;
_bstr_t strTitle;
_bstr_t strMessage;
LPSTR p_TempStr = NULL;
char chKey;
int i = 0;
try
{
//定义连接字符串
_bstr_t strCnn("Provider=sqloledb;Data Source=localhost;"
"Initial Catalog=pubs;User Id=sa;Password=;");
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(pConnection->Open(strCnn,"","",adConnectUnspecified));
rstTitles.CreateInstance(__uuidof(Recordset));
rstTitles->CursorType = adOpenDynamic;
rstTitles->LockType = adLockPessimistic;
//打开SQL Server服务器pubs数据库中的titles表
TESTHR(rstTitles->Open("titles", _variant_t((IDispatch*)pConnection,true),
adOpenDynamic, adLockPessimistic,adCmdTable));
rstTitles->MoveFirst();
pConnection->BeginTrans(); //开始事务处理
//在给定的_RecordsetPtr对象上查询IADORecordBinding接口指针
TESTHR(rstTitles->QueryInterface(
__uuidof(IADORecordBinding), (LPVOID*)&picRs));
//将给定_RecordsetPtr对象上titlrs关心的字段进行绑定
TESTHR(picRs->BindToRecordset(&titlrs));
p_TempStr = (LPSTR) malloc(sizeof(titlrs.m_szT_type));
assert(p_TempStr != NULL);
while (VARIANT_FALSE == rstTitles->EndOfFile)
{
//去掉字符串中的空格
strcpy(p_TempStr,strtok(titlrs.m_szT_type," "));
if (!strcmp(p_TempStr,"psychology"))
{
strTitle = titlrs.m_szT_title;
strMessage = "Title: " + strTitle +
"\n Change type to Self help?(y/n)";
printf("%s\n",(LPCSTR)strMessage);
do
{
chKey = getch();
}while(chKey != 'y' && chKey !='n');
if(chKey == 'y') //对当前记录进行修改
{
strcpy(titlrs.m_szT_type,"self_help");
picRs->Update(&titlrs);
}
}
rstTitles->MoveNext();
}
//是否将所做的修改提交事务处理
printf("\n\n Save all changes(y/n)?");
do
{
chKey = getch();
}while(chKey != 'y' && chKey !='n');
if(chKey == 'y') //提交事务处理
pConnection->CommitTrans();
else //会滚所做的数据修改
pConnection->RollbackTrans();
//进行新的数据查询,以进行显示
rstTitles->Requery(0);
rstTitles->MoveFirst();
printf("\n\nPress any key to continue...");
getch();
system("cls"); //清楚屏幕
TESTHR(rstTitles->QueryInterface(__uuidof(IADORecordBinding),
(LPVOID*)&picRs));
TESTHR(picRs->BindToRecordset(&titlrs));
while (!rstTitles->EndOfFile)
{
i= i+1;
if (i % 23 == 0)
{
printf("\nPress any key to continue...");
getch();
syste