在编写OLE DB实现分布式事务的代码中,使用了
DtcGetTransactionManager函数。在VC++编辑时,可以看到函数的参数提示。
可是,编译的时候却提示该函数是未定义的表识符。请问,是什么原因?
是不是漏掉了什么#include库?新手,初学用SDK编程,见笑见笑!
代码如下:
//*********************************************************
//使用OLE DB API控制分布式事务的例子
//运行本示例要求用户机器上安装有MSDAC SDK
//此示例假定本机已经有数据源MyOrder
//,该数据源连接到SQL Server数据库Northwind
//*********************************************************
#define UNICODE
#define _UNICODE
#define DBINITCONSTANTS
#define INITGUID#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <stddef.h>
#include <iostream.h>#include <oledb.h>
#include <oledberr.h>#include <msdaguid.h>
#include <msdasql.h>void main()
{
IDBInitialize *pIDBInitialize = NULL;
IDBCreateSession* pCreateSession = NULL;
IDBCreateCommand* pCreateCommand = NULL;
IRowset* pRowset = NULL;
ICommandText* pCommandText = NULL;
ITransaction* pTransaction = NULL;
ITransactionJoin* pTransactionJoin= NULL;
ITransactionDispenser* pTransactiondispenser = NULL;
IDBProperties* pIDBProperties; DBPROP InitProperties[4];
DBPROPSET rgInitPropSet[1];
int i;
LONG cNumRows;
bool bHasErr = FALSE; //要执行的命令
LPCTSTR wCmdString=OLESTR("SELECT EmployeeID,Title FROM EMPLOYEES");
LPCTSTR wSQL=OLESTR("Update Employees Set Title='AD Vice President' WHERE
EmployeeID=6"); CoInitialize(NULL); CoCreateInstance(CLSID_MSDASQL,NULL,CLSCTX_INPROC_SERVER,
IID_IDBInitialize,(void**) &pIDBInitialize); for(i=0;i<4;i++)
{
VariantInit(&InitProperties[i].vValue);
InitProperties[i].dwOptions=DBPROPOPTIONS_REQUIRED;
InitProperties[i].colid=DB_NULLID;
} //level of Prompt
InitProperties[0].dwPropertyID=DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt=VT_I2;
InitProperties[0].vValue.iVal=DBPROMPT_NOPROMPT; //UserName
InitProperties[1].dwPropertyID=DBPROP_AUTH_USERID;
InitProperties[1].vValue.vt=VT_BSTR;
InitProperties[1].vValue.bstrVal=SysAllocString((LPOLESTR)L"sa"); //password
InitProperties[2].dwPropertyID=DBPROP_AUTH_PASSWORD;
InitProperties[2].vValue.vt=VT_BSTR;
InitProperties[2].vValue.bstrVal=SysAllocString((LPOLESTR)L"364018"); //数据源名称
InitProperties[3].dwPropertyID=DBPROP_INIT_DATASOURCE;
InitProperties[3].vValue.vt=VT_BSTR;
InitProperties[3].vValue.bstrVal=SysAllocString((LPOLESTR)L"MyOrder"); rgInitPropSet[0].guidPropertySet=DBPROPSET_DBINIT;
rgInitPropSet[0].cProperties=4;
rgInitPropSet[0].rgProperties=InitProperties; //设置初始化属性
pIDBInitialize->QueryInterface(IID_IDBProperties,
(void**)&pIDBProperties);
pIDBProperties->SetProperties(1,rgInitPropSet);
pIDBProperties->Release(); //连接到数据源
HRESULT hr=pIDBInitialize->Initialize();
pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void
**)&pCreateSession);pCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pCreate
Command); hr=DtcGetTransactionManager(NULL,NULL,IID_ITransactionDispenser,0,0,NULL
,(void**)&pTransactionDispenser);//====>>>这一句编译出错了 //从Command得到ITransactionpCreateCommand->QueryInterface(IID_ITransactionLocal,(void**)&pTransaction); //启动本地事务
hr=((ITransactionLocal*)pTransaction)->StartTransaction(
ISOLATIONLEVEL_REPEATABLEREAD,0,NULL,NULL);
if SUCCEEDED(hr)
{
::printf("启动事务成功!");
} pCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown
**)&pCommandText); //执行UPDATE命令
pCommandText->SetCommandText(DBGUID_DBSQL,wSQL);
hr=pCommandText->Execute(NULL,IID_IRowset,NULL,&cNumRows,
(IUnknown**)&pRowset); if FAILED(hr)
bHasErr=TRUE;
else
printf("\n执行SQL:%S",wSQL); //执行SELECT命令
pCommandText->SetCommandText(DBGUID_DBSQL,wCmdString);
hr=pCommandText->Execute(NULL,IID_IRowset,NULL,&cNumRows,
(IUnknown**)&pRowset);
if FAILED(hr)
bHasErr=TRUE;
else
printf("\n执行SQL:%S",wCmdString); if(bHasErr)
{
pTransaction->Abort(NULL,FALSE,FALSE);
printf("\n事务回滚!\n");
}
else
{
pTransaction->Commit(FALSE,XACTTC_SYNC,0);
printf("\n事务提交!\n");
}; //清理内存
pTransaction->Release();
pRowset->Release();
pCommandText->Release();
pCreateCommand->Release();
pCreateSession->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release(); CoUninitialize();
};哪位如果实现过分布式事务,最好请给一点代码看看。感谢!
DtcGetTransactionManager函数。在VC++编辑时,可以看到函数的参数提示。
可是,编译的时候却提示该函数是未定义的表识符。请问,是什么原因?
是不是漏掉了什么#include库?新手,初学用SDK编程,见笑见笑!
代码如下:
//*********************************************************
//使用OLE DB API控制分布式事务的例子
//运行本示例要求用户机器上安装有MSDAC SDK
//此示例假定本机已经有数据源MyOrder
//,该数据源连接到SQL Server数据库Northwind
//*********************************************************
#define UNICODE
#define _UNICODE
#define DBINITCONSTANTS
#define INITGUID#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <stddef.h>
#include <iostream.h>#include <oledb.h>
#include <oledberr.h>#include <msdaguid.h>
#include <msdasql.h>void main()
{
IDBInitialize *pIDBInitialize = NULL;
IDBCreateSession* pCreateSession = NULL;
IDBCreateCommand* pCreateCommand = NULL;
IRowset* pRowset = NULL;
ICommandText* pCommandText = NULL;
ITransaction* pTransaction = NULL;
ITransactionJoin* pTransactionJoin= NULL;
ITransactionDispenser* pTransactiondispenser = NULL;
IDBProperties* pIDBProperties; DBPROP InitProperties[4];
DBPROPSET rgInitPropSet[1];
int i;
LONG cNumRows;
bool bHasErr = FALSE; //要执行的命令
LPCTSTR wCmdString=OLESTR("SELECT EmployeeID,Title FROM EMPLOYEES");
LPCTSTR wSQL=OLESTR("Update Employees Set Title='AD Vice President' WHERE
EmployeeID=6"); CoInitialize(NULL); CoCreateInstance(CLSID_MSDASQL,NULL,CLSCTX_INPROC_SERVER,
IID_IDBInitialize,(void**) &pIDBInitialize); for(i=0;i<4;i++)
{
VariantInit(&InitProperties[i].vValue);
InitProperties[i].dwOptions=DBPROPOPTIONS_REQUIRED;
InitProperties[i].colid=DB_NULLID;
} //level of Prompt
InitProperties[0].dwPropertyID=DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt=VT_I2;
InitProperties[0].vValue.iVal=DBPROMPT_NOPROMPT; //UserName
InitProperties[1].dwPropertyID=DBPROP_AUTH_USERID;
InitProperties[1].vValue.vt=VT_BSTR;
InitProperties[1].vValue.bstrVal=SysAllocString((LPOLESTR)L"sa"); //password
InitProperties[2].dwPropertyID=DBPROP_AUTH_PASSWORD;
InitProperties[2].vValue.vt=VT_BSTR;
InitProperties[2].vValue.bstrVal=SysAllocString((LPOLESTR)L"364018"); //数据源名称
InitProperties[3].dwPropertyID=DBPROP_INIT_DATASOURCE;
InitProperties[3].vValue.vt=VT_BSTR;
InitProperties[3].vValue.bstrVal=SysAllocString((LPOLESTR)L"MyOrder"); rgInitPropSet[0].guidPropertySet=DBPROPSET_DBINIT;
rgInitPropSet[0].cProperties=4;
rgInitPropSet[0].rgProperties=InitProperties; //设置初始化属性
pIDBInitialize->QueryInterface(IID_IDBProperties,
(void**)&pIDBProperties);
pIDBProperties->SetProperties(1,rgInitPropSet);
pIDBProperties->Release(); //连接到数据源
HRESULT hr=pIDBInitialize->Initialize();
pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void
**)&pCreateSession);pCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pCreate
Command); hr=DtcGetTransactionManager(NULL,NULL,IID_ITransactionDispenser,0,0,NULL
,(void**)&pTransactionDispenser);//====>>>这一句编译出错了 //从Command得到ITransactionpCreateCommand->QueryInterface(IID_ITransactionLocal,(void**)&pTransaction); //启动本地事务
hr=((ITransactionLocal*)pTransaction)->StartTransaction(
ISOLATIONLEVEL_REPEATABLEREAD,0,NULL,NULL);
if SUCCEEDED(hr)
{
::printf("启动事务成功!");
} pCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown
**)&pCommandText); //执行UPDATE命令
pCommandText->SetCommandText(DBGUID_DBSQL,wSQL);
hr=pCommandText->Execute(NULL,IID_IRowset,NULL,&cNumRows,
(IUnknown**)&pRowset); if FAILED(hr)
bHasErr=TRUE;
else
printf("\n执行SQL:%S",wSQL); //执行SELECT命令
pCommandText->SetCommandText(DBGUID_DBSQL,wCmdString);
hr=pCommandText->Execute(NULL,IID_IRowset,NULL,&cNumRows,
(IUnknown**)&pRowset);
if FAILED(hr)
bHasErr=TRUE;
else
printf("\n执行SQL:%S",wCmdString); if(bHasErr)
{
pTransaction->Abort(NULL,FALSE,FALSE);
printf("\n事务回滚!\n");
}
else
{
pTransaction->Commit(FALSE,XACTTC_SYNC,0);
printf("\n事务提交!\n");
}; //清理内存
pTransaction->Release();
pRowset->Release();
pCommandText->Release();
pCreateCommand->Release();
pCreateSession->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release(); CoUninitialize();
};哪位如果实现过分布式事务,最好请给一点代码看看。感谢!
ADO有 BeginTrans
CommitTrans
能说的更明白一点吗?是要添加关于COM+的类库吗?