用oracle的provider
连接字符串里加上'plRSet=1'
连接字符串里加上'plRSet=1'
解决方案 »
- 请问怎样让两个已经做好的窗体相互继承?
- [广告贴]EjunGrid1.0 一款高品质的Excel风格表格控件
- 如何获得hint属性
- 有什么办法可以在进程的范围内设置一个共有变量?
- 关于dbgrid的问题,这个问题应该对所有的人都有帮助吧..
- 一个关于远程数据库共享的问题,在线等,,急啊,想了好几天拉,
- 在FastReport中做分组统计时,如何得到总页数?
- 我的专家分刚过300分,三个绿星要多少分才行?
- 急,后天就要答辩了:把一个表里的记录添加到另一个表里的问题,看看我的代码错在那里了?
- 我要透明的Panel, 快没气了, 找了一下午!!!!!
- 谁有x.25协议包的格式?
- 关于数据统计的一个问题(急)
"用oracle的provider"
是Delphi提供的还是Oracle提供的?
http://otn.oracle.com/software/tech/windows/ole_db/content.html
下载,免费注册
如果用了MTS,要安装oracle for mts服务
在http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/win.817/a85259/toc.htm
和
http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/win.817/a73029/toc.htm
有详细资料
连接字符串这样写:
ConnectStr:=Format('PLSQLRSet=1;Password=%s;Persist Security Info=True;User ID=%s;Data Source=%s;Extended Properties=""',[Password,UserName,DatabaseName]);
OraADOConnection.Provider:='OraOLEDB.Oracle';
OraADOConnection.ConnectionString:=ConnectStr;
OraADOConnection.LoginPrompt:=False;
OraADOConnection.Open;
这样连接
调用存储过程不能用plsql方式
要这样写:
'{CALL open_table}'
open_table这个存储过程作用是打开表,有一个cursor参数返回数据集
用ADODataSet执行这条语句,就可以返回一个数据集,不用设置param
切勿用ADOStoredProc
因为ADOStoredProc就是把CommandType设为cmdStoredProc的dataset
但是执行这条语句一定要把CommandType设为cmdText
//ParamName: 一个Input参数
//ParamValue: 传入的Input参数的值
//OutName: 一个Output参数
//返回: Output参数的值
function ExecStoredFunc(ProcName, ParamName, ParamValue, OutName: string): string;
var
storedProc: TADOStoredProc;
begin
try
storedProc:= TADOStoredProc.Create(self);
With storedProc do
begin
Connection:= m_ADOConnection;
ProcedureName:= ProcName;
Parameters.CreateParameter(ParamName, ftString, pdInput, 20, ParamValue );
Parameters.CreateParameter(OutName, ftString, pdOutput, 11, '' );
Prepared:= True;
ExecProc;
end;
result:= StoredProc.Parameters.ParamValues[OutName];
storedProc.Free;
except
on E: Exception do
begin
//在此处理异常
end;
end;
end;
但是传出cursor不行
cursor就不行了
我的adoStoredProc放在中间层,我从client端传递参数给中间层的存储过程,
我如何在客户端取得adostoredProc的输出参数呢?AdoStoredProc组件的parameters属性的dataType参数和value.type参数有何区别?我这样试了:
在中间层做一个方法:比如有3个参数,其中两个供调用存储过程要的输入参数,一个用于接受存储过程的输出参数。然后在客户端调用这个方法,编译出错。谁能帮我解决了,加分酬谢!
//Get_Name_F有三个输入参数,通过函数名返回结果(天哪,我现在才搞清楚,后台原来是function,不是procedure,这在Delphi中还用存储过程吧?)。
//dspGetName为appServer中一datasetProvider,对应aspGetName。[appServer端]
...
procedure GetName(const fName, tType, tFlag: WideString;out aName:olevariant); safecall;
...
procedure TSoRemoteDataModule.GetName(const fName, tType,
tFlag: WideString);
begin
aspGetNameF.Parameters[1].Value :=fName;
aspGetNameF.Parameters[2].Value :=tType;
aspGetNamef.Parameters[3].Value :=tflag;
aspGetNamef.Prepared ;
aspgetNamef.open;
aName:=dspGetNameF.data;
end;
...[client端]
//SODataModule.DCOMConnection1为client端dataModule上的连接对象
...
procedure TRegForm.FormCreate(Sender: TObject);
begin
lblVname.Caption:=SODataModule.DCOMConnection1.AppServer.
GetName('v_name','s','c');end;
...[说明]
1。后台Function只有3个输入参数,没有输出参数,DBA说通过函数名返回值,这我理解,可是我在appServer 中通过View|Type Library添加接口方法,为什么只有procedure,没有Function?(我想肯定行,只是我不会罢了)2。在client端调用appserver中接口方法,返回结果是自动放在某clientDataSet中,还是能直接赋给一相应变量?调用appServer中存储过程时,有输出
参数client端怎么使用,无输出参数client端怎么使用?能举一例?3。在appServer 中通过View|Type Library添加接口方法,定义参数类型时为什么与标准数据类型不一一对应,比如找不到string型,而有BSTR即widestring型,我最糊涂的是返回参数的类型,比如明显返回string,它却要是HRESULT型,在前端要olevariant,哎,什么规律呀实在糊涂!书上一般都这么写,也没什么说明,大多数新手对这一块都是死穴,哪位高人能指点迷津,我愿高分酬谢!
//Get_Name_F有三个输入参数,通过函数名返回结果(天哪,我现在才搞清楚,后台原来是function,不是procedure,这在Delphi中还用存储过程吧?)。
//dspGetName为appServer中一datasetProvider,对应aspGetName。[appServer端]
...
procedure GetName(const fName, tType, tFlag: WideString;out aName:olevariant); safecall;
...
procedure TSoRemoteDataModule.GetName(const fName, tType,
tFlag: WideString);
begin
aspGetNameF.Parameters[1].Value :=fName;
aspGetNameF.Parameters[2].Value :=tType;
aspGetNamef.Parameters[3].Value :=tflag;
aspGetNamef.Prepared ;
aspgetNamef.open;
aName:=dspGetNameF.data;
end;
...[client端]
//SODataModule.DCOMConnection1为client端dataModule上的连接对象
...
procedure TRegForm.FormCreate(Sender: TObject);
begin
lblVname.Caption:=SODataModule.DCOMConnection1.AppServer.
GetName('v_name','s','c');end;
...[说明]
1。后台Function只有3个输入参数,没有输出参数,DBA说通过函数名返回值,这我理解,可是我在appServer 中通过View|Type Library添加接口方法,为什么只有procedure,没有Function?(我想肯定行,只是我不会罢了)2。在client端调用appserver中接口方法,返回结果是自动放在某clientDataSet中,还是能直接赋给一相应变量?调用appServer中存储过程时,有输出
参数client端怎么使用,无输出参数client端怎么使用?能举一例?3。在appServer 中通过View|Type Library添加接口方法,定义参数类型时为什么与标准数据类型不一一对应,比如找不到string型,而有BSTR即widestring型,我最糊涂的是返回参数的类型,比如明显返回string,它却要是HRESULT型,在前端要olevariant,哎,什么规律呀实在糊涂!书上一般都这么写,也没什么说明,大多数新手对这一块都是死穴,哪位高人能指点迷津,我愿高分酬谢!
调用函数的sql这样写:'select GetName('v_name','s','c') from dual'
这样dataset中就会有一个只包含一条纪录、一个字段的数据集,就是函数的返回值com是要跨语言的,所以用的正好是标准的数据类型,而不是delphi的数据类型
通过接口只能返回指针,所以输出参数必须是olevariant
如果用函数返回,这是值传递方式,就无法释放服务段已经分配的内存,所以只能用procedure传递指针参数
olevariant如何转换成string型或其他类型?比如下面代码如何改错://在client端调用GetName(),aName参数对应appserver中定义的接口的out型参数...
var
aName:olevariant;
...
SODataModule.DCOMConnection1.AppServer.GetName('v_name','s','c', aName);
label1.caption:=aName;
...等候大家讨论
adostoredproc和adodataset都是从TCustomADODataSet继承的
无非是adostoredproc在构造函数中加了一句
Command.CommandType := cmdStoredProc;
这个Command是一个TADOCommand
如果你非要用adostoredproc
自己写一句Command.CommandType := cmdText;OLEVariant不需要显式转换
如果aName是oleVariant
label1.caption:=aName;没错