StoredProc不能返回结果集

foxe 2004-07-14 11:46:20
SQL :
===========================================
CREATE PROCEDURE dbo.my_quserproject
@qUsername Char(15)
AS
IF @qUsername IS NULL
BEGIN
RAISERROR('Username is empty!',14,1)
RETURN
END

SELECT a.proj_name FROM tb_proj a, (SELECT c.proj_id FROM tb_userproj c JOIN tb_user d ON c.[user_id] = d.[user_id] WHERE d.[user_name] = @qUsername) b
WHERE a.proj_id = b.proj_id
GO
=========================================================



Delphi(server):
=========================================================
procedure Tworkser.Quserproj(const UName: WideString);
begin
adosp_1.Close;
adosp_1.ProcedureName := 'my_quserproject';
adosp_1.Parameters.AddParameter.Name := '@qUsername';
adosp_1.Parameters.ParamValues['@qUsername'] := UName;
adosp_1.Prepared;
adosp_1.ExecProc;
end;

=========================================================

Client
=========================================================
with DM1 do
begin
Cds_1.Close;
DcomC_1.AppServer.Quserproj(str_login_name);
Cds_1.Open;
dbgrid1.DataSource := ds_1;
=========================================================


dbgrid1 显示为空,sql里可以返回:
==========================================================
proj_name
---------------
HW
Srvate
DDesign
Metek

(所影响的行数为 4 行)
============================================================

我想在ListBox中列出值该怎么写啊!
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wozhuchuanwei 2004-07-16
  • 打赏
  • 举报
回复
Client
=========================================================
with DM1 do
begin
Cds_1.Close;
DcomC_1.AppServer.Quserproj(str_login_name);
Cds_1.Open;
dbgrid1.DataSource := ds_1;
=========================================================
改为:
Client
=========================================================
with DM1,ClientDataSet1 do
begin
Date := DcomC_1.AppServer.Quserproj(str_login_name);
end;
=========================================================

以上两段请自己测试
wozhuchuanwei 2004-07-16
  • 打赏
  • 举报
回复
Delphi(server):
=========================================================
procedure Tworkser.Quserproj(const UName: WideString);
begin
adosp_1.Close;
adosp_1.ProcedureName := 'my_quserproject';
adosp_1.Parameters.AddParameter.Name := '@qUsername';
adosp_1.Parameters.ParamValues['@qUsername'] := UName;
adosp_1.Prepared;
adosp_1.ExecProc;
end;

申明成一个函数
function Tworkser.Quserproj(const UName: WideString);OleVariant;
begin
adosp_1.Close;
adosp_1.ProcedureName := 'my_quserproject';
adosp_1.Refresh;
adosp_1.Parameters.AddParameter.Name := '@qUsername';
adosp_1.Parameters.ParamValues['@qUsername'] := UName;
adosp_1.Prepared;
adosp_1.ExecProc;
Result := adosp_1.Data;
end
zgq19801123 2004-07-16
  • 打赏
  • 举报
回复
UP
foxe 2004-07-16
  • 打赏
  • 举报
回复
to wozhuchuanwei(单身一卒)
谢谢你的回复!
你的CODE我不太能看懂,但我会努力看一下!可以的话,你可以看我上面贴的Code有什么问题,可以帮我指一下吗?
foxe 2004-07-15
  • 打赏
  • 举报
回复
没人能解决,还是大家都不愿意啊!
wozhuchuanwei 2004-07-15
  • 打赏
  • 举报
回复
客户端调用:
with BatchSelDM,AppExec,CDS_BatchSel_Exec do
begin
Data := SSExec('Exec','PTBP_StockSel;1',VarArrayOf(['@dt_BegDate','@dt_EndDate']),VarArrayOf([bsDE_Beg.Text,bsDE_End.Text]),EmptyWideStr);
end;
wozhuchuanwei 2004-07-15
  • 打赏
  • 举报
回复
你的服务器没有返回结果,给你看看我写的一个列子:
function TYxCy_SupplySystemMain.SSExec(const ASPName, ProName: WideString;
ArrPara, ArrValue: OleVariant; out RetOut: WideString): OleVariant;
Var
i:Integer;
AspExec : TADOStoredProc;
AspDSP : TDataSetProvider;
begin
try
RetOut := '';
AspExec := FindComponent('ASP_'+ASPName) as TADOStoredProc;
AspDSP := FindComponent('DSP_'+ASPName) as TDataSetProvider;
AspExec.Connection := ASP_Exec.Connection;
with AspExec,Parameters do
begin
Close;
ProcedureName := ProName;
Refresh;
for i:=0 to 99 do
begin
try VarToStr(ArrPara[i]);
ParamByName(ArrPara[i]).Value := ArrValue[i];
except
break;
end;
end;
Result := AspDSP.Data;
RetOut := Parameters.ParamByName('@vc_ErrMsg').Value;
AspExec.Close;
end;
SetComplete;
except
Result := '应用服务器发生错误';
SetAbort;
end;
end;
wolf2005 2004-07-15
  • 打赏
  • 举报
回复
不返回结果集
foxe 2004-07-14
  • 打赏
  • 举报
回复
我真傻,线搭错了!呵呵
可第一个问题用ADOstorproc,能不能帮忙解决!
yleiou 2004-07-14
  • 打赏
  • 举报
回复
for I := 0 To clientdataset1.recordcount -1 do
begin
ListBox1.Items.Add(clientdataset1.fieldByName('XX').AsString);
clientdataset1.Next;
end
foxe 2004-07-14
  • 打赏
  • 举报
回复
不是说存储过程的效率高吗?如果有很复杂的查询不是很慢的吗?
在请教:改成ADOQUERY后如何把结果集加到ListBox中
这样写对不?反正现在报错
==============================================
for I := 0 To clientdataset1.recordcount -1 do
ListBox1.Items.Add(clientdataset1.DataSetField.FieldValues[I]);
itlcx 2004-07-14
  • 打赏
  • 举报
回复
为什么非要存储过程呢?
foxe 2004-07-14
  • 打赏
  • 举报
回复
Delphi(server):
=========================================================
procedure Tworkser.Quserproj(const UName: WideString);
begin
adosp_1.Close;
adosp_1.ProcedureName := 'my_quserproject';
adosp_1.Parameters.AddParameter.Name := '@qUsername';
adosp_1.Parameters.ParamValues['@qUsername'] := UName;
adosp_1.Prepared;
adosp_1.Open;//返回结果集用Open
end;

=========================================================

可为什么还是不行!我试过在APPSERVER上改用EXEC 可在Client上还是得不到
Erice 2004-07-14
  • 打赏
  • 举报
回复
用 “EXEC 存储过程名”,当然,调用就用QUERY一类的,,就可以返回值

2,498

社区成员

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

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