PB各种数据连接接口的优缺点?

不是导演李安 2010-07-17 11:22:38
PB提供了很多数据库连接的接口还有PB自己专有的连接(我这里就说是专连吧)。
我想知道他们之间有什么区别。特别是专连和其他的连接,在连接速度上、稳定性方面、安装方面等等。

我手上的一个项目用到了专连和ODBC连接两种方式,现在我想舍弃一种。或者干脆用第三种,谢谢各位大哥大姐给予小弟宝贵意见。
...全文
297 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
不是导演李安 2011-01-19
  • 打赏
  • 举报
回复
多谢大家的积极回复,新年来了,看来需要结贴了。辛苦大家了。
184270428 2010-08-15
  • 打赏
  • 举报
回复
/*
作者: 孙益华
开码功能:
call("类","方法")
call(对象,"方法")
扫描数据库
*/
#pragma warning(disable : 4786)
#include <windows.h>
#include <pbext.h>
#include <richedit.h>
#include <commctrl.h>
#include <math.h>
#include <string>
extern "C"
{
#include <oratypes.h>
#include <ociapr.h>
/* demo constants and structs */
#include <ocidem.h>
}
#pragma comment(lib,"oci.lib")
using std::string;

PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription()
{
static const TCHAR desc[] = {
"class n_objcall from nonvisualobject\n"
"subroutine of_call(string class_name,string Method_name,string signature,string arguments[])\n"
"subroutine of_call(powerobject pbo,string method_name,string signature,string arguments[])\n"
"subroutine of_startdblisten(string dbusername,string dbpassword,string sql,string class_name,string method_name,long cstep)\n"
"end class\n"
};
return desc;
}

VOID callobj(IPB_Session* session,string class_name,string method_name);
VOID FAR dblisten(string username,string password,string sql,IPB_Session* session,string class_name,string method_name,sword* rows);
DWORD WINAPI DBListenThread(LPVOID lpParam);
typedef struct
{
string username;
string password;
IPB_Session* session;
string class_name;
string method_name;
string sql;
LONG cstep;
}THREADDATA;
class CNonVisualExt : public IPBX_NonVisualObject
{
IPB_Session* d_session;
pbobject d_pbobj;
HANDLE thread;
THREADDATA data;
public:
CNonVisualExt(IPB_Session* session, pbobject pbobj)
:
d_session(session),
d_pbobj(pbobj),
thread(NULL)
{

}

~CNonVisualExt()
{
}


PBXRESULT Invoke
(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci
);

void Destroy()
{
if(thread)
{
DWORD exitcode;
GetExitCodeThread(thread,&exitcode);
if(exitcode == STILL_ACTIVE)
{
TerminateThread(thread,0);
}
}
delete this;
}

};



PBXRESULT CNonVisualExt::Invoke
(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci
)
{

switch(mid)
{
case 0:
{
pbgroup group;
pbclass cls;
pbobject pbobj;
pbmethodID callmid;
PBCallInfo* callinfo;
pblong dim,n,ll_count;
pbarray in_array;
pbboolean bIsNull = 0;
if(session)
{
group = session-> FindGroup(session->GetString(ci->pArgs->GetAt(0)->GetString()),pbgroup_userobject);
if (group)
{
cls = session->FindClass(group,session->GetString(ci->pArgs->GetAt(0)->GetString()));
if(cls)
{
pbobj = session->NewObject(cls);
if(pbobj)
{
ll_count = ci->pArgs->GetCount();
callmid = session->GetMethodID(cls,session->GetString(ci->pArgs->GetAt(1)->GetString()),PBRT_FUNCTION,session->GetString(ci->pArgs->GetAt(2)->GetString()));
if(callmid != kUndefinedMethodID)
{
callinfo = new PBCallInfo;
session->InitCallInfo(cls,callmid,callinfo);
in_array = ci->pArgs->GetAt(3)->GetArray();
ll_count = session->GetArrayLength(in_array);
for(n=0; n<ll_count; n++)
{
dim = n + 1;
callinfo->pArgs->GetAt((pbint)n)->SetPBString(session->GetStringArrayItem(in_array,&dim,bIsNull));
}
session->InvokeObjectFunction(pbobj,callmid,callinfo);
session->FreeCallInfo(callinfo);
}
session->RemoveLocalRef(pbobj);
}
}
}
}

}
break;
case 1:
{
pbclass cls;
pbobject pbobj;
pbmethodID callmid;
PBCallInfo* callinfo;
pblong dim,n,ll_count;
pbarray in_array;
pbboolean bIsNull = 0;
if(session)
{
pbobj = ci->pArgs->GetAt(0)->GetObjectA();
if(pbobj)
{
cls = session->GetClass(pbobj);
if(cls)
{
ll_count = ci->pArgs->GetCount();
callmid = session->GetMethodID(cls,session->GetString(ci->pArgs->GetAt(1)->GetString()),PBRT_FUNCTION,session->GetString(ci->pArgs->GetAt(2)->GetString()));
if(callmid != kUndefinedMethodID)
{
callinfo = new PBCallInfo;
session->InitCallInfo(cls,callmid,callinfo);
in_array = ci->pArgs->GetAt(3)->GetArray();
ll_count = session->GetArrayLength(in_array);
for(n=0; n<ll_count; n++)
{
dim = n + 1;
callinfo->pArgs->GetAt((pbint)n)->SetPBString(session->GetStringArrayItem(in_array,&dim,bIsNull));
}
session->InvokeObjectFunction(pbobj,callmid,callinfo);
session->FreeCallInfo(callinfo);
}
}
}
}

}
break;
case 2:
if(!thread)
{
data.username =string(session->GetString(ci->pArgs->GetAt(0)->GetString()));
data.password =string(session->GetString(ci->pArgs->GetAt(1)->GetString()));
data.sql =string(session->GetString(ci->pArgs->GetAt(2)->GetString()));
data.session =session;
data.class_name =string(session->GetString(ci->pArgs->GetAt(3)->GetString()));
data.method_name =string(session->GetString(ci->pArgs->GetAt(4)->GetString()));
data.cstep =ci->pArgs->GetAt(5)->GetLong();
data.cstep =data.cstep >= 0 ? data.cstep :0;
thread=CreateThread(NULL,0,DBListenThread,(LPVOID)&data,0,NULL);
}
break;
/*default:
return PBX_FAIL;*/
}
return PBX_OK;
}

PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject
(
IPB_Session* pbsession,
pbobject pbobj,
LPCTSTR className,
IPBX_NonVisualObject **obj
)
{
PBXRESULT result = PBX_OK;

string cn(className);

if (cn.compare("n_objcall") == 0)
{
*obj = new CNonVisualExt(pbsession, pbobj);
}
else
{
*obj = NULL;
result = PBX_FAIL;
}

return PBX_OK;
};

VOID callobj(IPB_Session* session,string class_name,string method_name)
{
if(!session)return;
pbgroup group = session-> FindGroup(class_name.c_str(),pbgroup_userobject);
if (!group) return;
pbclass cls = session->FindClass(group,class_name.c_str());
if(!cls) return;
pbobject pbobj = session->NewObject(cls);
if(!pbobj) return;
pbmethodID callmid=session->GetMethodID(cls,method_name.c_str(),PBRT_FUNCTION, "Q");
PBCallInfo* callinfo = new PBCallInfo;
session->InitCallInfo(cls,callmid,callinfo);
session->InvokeObjectFunction(pbobj,callmid,callinfo);
session->FreeCallInfo(callinfo);
session->RemoveLocalRef(pbobj);
}

VOID FAR dblisten(string username,string password,string sql,IPB_Session* session,string class_name,string method_name,sword* rows)
{

Lda_Def FAR pLda;
Cda_Def FAR pCda;
ub1 hda[HDA_SIZE];
sword rowcount;

#define DEFER_PARSE 1
#define VERSION_7 2
memset(hda,0,HDA_SIZE);
if(olog(&pLda,hda,(OraText *)username.c_str(),-1,(OraText *)password.c_str(),-1,NULL,-1,OCI_LM_DEF) == 0)
{
if(oopen(&pCda,&pLda,NULL, -1, -1, NULL, -1) == 0)
{
if(oparse(&pCda,(OraText *)sql.c_str(), -1, DEFER_PARSE, (ub4) VERSION_7) == 0)
{
if (odefin(&pCda, 1, (ub1 *) &rowcount, (sword) sizeof(sword),(sword) INT_TYPE,(sword) -1, (sb2 *) 0, (text *) 0, -1, -1,(ub2 *) 0, (ub2 *) 0)==0)
{
if(oexfet(&pCda, (ub4)1, FALSE, FALSE)==0)
{
if(*rows != rowcount)
{
*rows = rowcount;
callobj(session,class_name,method_name);
}

}
}
}
oclose(&pCda);
}
ologof(&pLda);
}
}

DWORD WINAPI DBListenThread(LPVOID lpParam)
{
THREADDATA data;
data = *(THREADDATA *)lpParam;
sword rows = 0;
threadbegin:
try
{
while(TRUE)
{
Sleep(data.cstep);
dblisten(data.username,data.password,data.sql,data.session,data.class_name,data.method_name,&rows);
}
}
catch(...)
{
Sleep(data.cstep);
goto threadbegin;
}
}

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD reasonForCall,
LPVOID lpReserved
)
{
switch (reasonForCall)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;

case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

184270428 2010-08-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 huwenfeng2001hf 的回复:]
向exe文件传递transaction?
没有想到还到这样的
[/Quote]

谁叫你加字的,多一个字,就是另一种意思了。

一种是传sqlca.dbhandle()
一种是传transaction
第二种,是VC反过来调用PB

我做过一个,VC调用PB,PB再调用VC
huwenfeng2001hf 2010-08-14
  • 打赏
  • 举报
回复
向exe文件传递transaction?
没有想到还到这样的
netzgj 2010-08-14
  • 打赏
  • 举报
回复
用SNC连接的飘过。。。
184270428 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lackin 的回复:]
odbc还是比较方便的,部署什么。

其实我最关心的是速度问题。ODBC是不是比专连要慢很多。提别是大数据量的。公司所实施的项目数据量会很大。
[/Quote]
专连可能会快很多,没有找到这方面的资料。

184270428 2010-08-04
  • 打赏
  • 举报
回复
没有人用专连,传sqlca.dbhandle()成功的吗?
关注此问题。
DYFDWX 2010-08-04
  • 打赏
  • 举报
回复
顶,我现在用的也是专连
184270428 2010-08-03
  • 打赏
  • 举报
回复
传参重连就可以:
VOID FAR WINAPI PASCAL dblisten(OraText *username,OraText *password)
{

Lda_Def FAR pLda;// = (Lda_Def FAR *)dbhandle;
Cda_Def FAR pCda;// =(Cda_Def FAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Cda_Def));//(Cda_Def FAR *)GlobalAlloc(GMEM_MOVEABLE,sizeof(Cda_Def));
ub1 hda[HDA_SIZE];
sword rowcount;
#define DEFER_PARSE 1
#define VERSION_7 2
__try
{
memset(hda,0,HDA_SIZE);
if(olog(&pLda,hda,username,-1,password,-1,NULL,-1,OCI_LM_DEF) == 0)
{
if(oopen(&pCda,&pLda,NULL, -1, -1, NULL, -1) == 0)
{
if(oparse(&pCda,(OraText *)"select count(1) from z_scanning", -1, DEFER_PARSE, (ub4) VERSION_7) == 0)
{
if (odefin(&pCda, 1, (ub1 *) &rowcount, (sword) sizeof(sword),(sword) INT_TYPE,(sword) -1, (sb2 *) 0, (text *) 0, -1, -1,(ub2 *) 0, (ub2 *) 0)==0)
{

if(oexfet(&pCda, (ub4)1, FALSE, FALSE)==0)
{
if(rowcount)
::MessageBox(0,"1","1",MB_OK);
else
::MessageBox(0,"2","2",MB_OK);
}
}
}
}
oclose(&pCda);
}

}
__finally
{
//GlobalFree(pCda);
//HeapFree(GetProcessHeap(), 0,pCda);
}
}
184270428 2010-08-03
  • 打赏
  • 举报
回复
头文件:
#pragma warning(disable : 4786)
#include <windows.h>
#include <pbext.h>
#include <richedit.h>
#include <commctrl.h>
#include <math.h>
#include <string>
extern "C"
{
#include <oratypes.h>
#include <ociapr.h>
/* demo constants and structs */
#include <ocidem.h>
}
#pragma comment(lib,"oci.lib")
184270428 2010-08-03
  • 打赏
  • 举报
回复
这也试了一下。
VOID FAR WINAPI PASCAL dblisten(LONG dbhandle)
{

Lda_Def FAR *pLda = (Lda_Def FAR *)dbhandle;
Cda_Def FAR *pCda = (Cda_Def FAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Cda_Def));
if(!pCda )
return;
__try
{

if(!oopen(pCda, pLda,NULL, -1, -1, NULL, -1)==0)//这里一直不成功
return;
if(oparse(pCda,(OraText *)"select count(1) from z_scanning", -1, 0, 1))
{
if (pCda->rpc)
::MessageBox(0,"1","1",MB_OK);
else
::MessageBox(0,"2","2",MB_OK);
}
oclose(pCda);

}
__finally
{
HeapFree(GetProcessHeap(), 0,pCda);
}
}
永生天地 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lackin 的回复:]
现在我们公司的情况是这样的,产品是PB开发的,而二次开发式VC做的。现在VC有一个接口我们需要传递transaction指针给他。如果用专用连接,VC好像无法识别。
请赐教。
[/Quote]
如果真是那样,我感觉oledb还是要比odbc强
不是导演李安 2010-07-18
  • 打赏
  • 举报
回复
odbc还是比较方便的,部署什么。

其实我最关心的是速度问题。ODBC是不是比专连要慢很多。提别是大数据量的。公司所实施的项目数据量会很大。
不是导演李安 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 184270428 的回复:]
是传sqlca.dbhandle(),还是使用pbni传transaction呢?
[/Quote]

传的sqlca.dbhandle()
cx510158746 2010-07-17
  • 打赏
  • 举报
回复
学习了....
chengg0769 2010-07-17
  • 打赏
  • 举报
回复
同意宝宝传奇。情况就是这样的。
shc989 2010-07-17
  • 打赏
  • 举报
回复
有专用,还是用专用比较好,ODBC还需要配置,发布不方便,专用的和执行文件拷在一起就行了.
连SQL SERVER OLE DB也是比较好的方法.
184270428 2010-07-17
  • 打赏
  • 举报
回复
是传sqlca.dbhandle(),还是使用pbni传transaction呢?

不是导演李安 2010-07-17
  • 打赏
  • 举报
回复
现在我们公司的情况是这样的,产品是PB开发的,而二次开发式VC做的。现在VC有一个接口我们需要传递transaction指针给他。如果用专用连接,VC好像无法识别。
请赐教。

752

社区成员

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

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