about delphi's component storeprocedure(200分)

  • 主题发起人 主题发起人 3p
  • 开始时间 开始时间
3

3p

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi开发sql6.5数据库系统, 对delphi的storeproc构件有个疑问,在程序中用1个的storeproc调用sql后台多个的存储过程,如果过程有输出参数,在设计阶段似乎必须先设定output参数的类型,但这样如果想在程序中动态调用另外的存储过程,因参数类型不明,结果得delphi的出错信息---"参数类型没指定",请高手指路! 
 
试试:
StoredProc1.Params.CreateParam
StoredProc1.Params.AddParam
StoredProc1.Params.RemoveParam
 

with StoredProc1 do
Params[1].ParamType = ptInput
// or Params.ParamType = ptInputOutput

详细见Tparam类的help.
如果要详细解释, 请告知.
 
对于动态调用存储过程,您完全可以不用TStoredProc,使用TQuery,
只须动态改变TQuery.SQL.

例:
Query1.SQL.Text:='Execute storedproc1 param1 ,param2...';
Query1.Open;//返回数据集
or
Query1.ExecSQL;//不返回数据集


 
动态创建param,并指定参数类型:
var
P1,P2:TParam;
begin
...
with StoredProc1 do begin
StoredProcName := 'MyProc';
Params.Clear;
P1 := TParam.Create(Params, ptInput);
P2 := TParam.Create(Params, ptOutput);
try
Params[0].Name := 'EMP_NO';
Params[1].Name := 'PROJ_ID';
ParamByName('EMP_NO').AsInteger := 10;
ExecProc;
Edit1.Text := ParamByName('PROJ_ID').AsString;
finally
P1.Free;
P2.Free;
end;
end;
...
end;
 
代码如下:
只须调用BuildStoredProcParams(StoredProc1)即可设好参数.




const StoredProcParamType:array [0..5] of TParamType =(ptUnknown,ptInput,ptInputOutput,ptOutput,ptInputOutput,ptResult);

function GetParamsFieldType(TypeStr:string):TFieldType;
begin
if TypeStr='int' then
Result:=ftInteger
else if (TypeStr='char') or (TypeStr='varchar') or (TypeStr='sysname') then
Result:=ftString
else if TypeStr='datetime' then
Result:=ftDateTime
else if (TypeStr='image') or (TypeStr='text') then
Result:=ftBlob
else if (TypeStr='smallint') or (TypeStr='tinyint') then
Result:=ftSmallint
else if (TypeStr='binary') then
Result:=ftBytes
else if (TypeStr='varbinary') then
Result:=ftVarBytes
else if (TypeStr='bit') then
Result:=ftBoolean
else if (TypeStr='real') or (TypeStr='float') then
Result:=ftFloat
else if (TypeStr='numeric') or (TypeStr='decimal') then
Result:=ftBCD
else if (TypeStr='smallmoney') or (TypeStr='money') then
Result:=ftCurrency
else if (TypeStr='uniqueidentifier') then
Result:=ftString
else
Result:=ftUnknown;
//endif
end;

procedure BuildStoredProcParams(StoredProc:TStoredProc);
var tmpQuery;
i:integer;
begin
StroedProc.Params.Clear;
tmpQuery:=TQuery.Create(nil);
try
tmpQuery.DatabaseName=StroedProc.DatabaseName;
tmpQuery.SQL.Text:='sp_sproc_columns '''+StroedProc1.StoredProcName+'''';
tmpQuery.Open;
if not (tmpQuery.EOF and tmpQuery.BOF) then begin
tmpQuery.First;
while not tmpQuery.EOF do begin
i:=tmpQuery.FieldByName('COLUMN_TYPE').Value;
StroedProc1.Params.CreateParam(GetParamsFieldType(tmpQuery.FieldByName('TYPE_NAME').AsString),
tmpQuery.FieldByName('COLUMN_NAME').AsString,
StoredProcParamType);
tmpQuery.Next;
end;
end;
finally
tmpQuery.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部