delphi疯了,还是偶疯了,这问题没有再简单的了,可为什么就通不过,1+1为什么就不等于2,起了怪了,有没有天理了?//牛虻

chris2019 2001-11-03 07:40:00
一个绝简单的存储过程:
CREATE PROCEDURE login
@username char,
@passwd char
as
select *
from pass
where username = @username and passwd = @passwd
GO

再用这个执行:
parambyname('@username').value:=edit1.text;
parambyname('@passwd').value:=edit2.text;
execproc;
if recordcount=1 then
showmessage('ok');

delphi非报错:cannot perform this operation on a close dataset
偶吧存储过程组件的active设置为true,
嘿,偶差点要骂:
delphi又报错:cannot perform this operation on an open dataset

你说还有这么可气的吗???
...全文
195 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxiaoban 2001-11-06
  • 打赏
  • 举报
回复
你Build All试一下,

我上次在VC中也碰到这种事情,

一个Bool变量竟然既不是TRUE,也不是FALSE;
zfmich 2001-11-06
  • 打赏
  • 举报
回复
呵呵,我觉得RECORDCOUNT有问题,如果是QUERY或者DATASET的话,要先移动记录指针才能获得真正的记录数。不妨也可以试试。
yxjjx 2001-11-06
  • 打赏
  • 举报
回复
观注
chris2019 2001-11-06
  • 打赏
  • 举报
回复
jjhaonou(jj) 
delphi没有反应
用if then
show('y')
else
show('n')
测试,show ('n')
orient_fc 2001-11-04
  • 打赏
  • 举报
回复
我也遇到这个问题,我是用TABLE控件。。有问题。
后来改成QUERY就好了,不知为什么。。
而且原来用TABLE也是好用的,突然不好用。。不明白。。。
adailee 2001-11-03
  • 打赏
  • 举报
回复
我调试过了,通过。
--------------------------------------------------------
CREATE TABLE [dbo].[Users] (
[UserName] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PassWd] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
-------------------------------------------------------------
CREATE PROCEDURE login
@UserName varchar(10),
@PassWd varchar(10)
as
select * from users where userName=@UserName and PassWd=@PassWd
GO
------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.Parameters.ParamByName('@UserName').Value:='Adai';
ADOStoredProc1.Parameters.ParamByName('@PassWd').Value:='adai22';
ADOStoredProc1.Active:=True;
if ADOStoredProc1.RecordCount>0 then
showMessage('Login!');
end;
chris2019 2001-11-03
  • 打赏
  • 举报
回复
那个源代码,偶不久就要公布在偶得网页上
现在正忙着整理
adailee 2001-11-03
  • 打赏
  • 举报
回复
to:chris2019(牛虻——春风不问路) 
不是,我没有和你打交道啦。我看见源代码交换的贴子上的留言,所以
有疑问。:-)
另外,你有没有试着用TAdoDataSet解决呢?我觉得TAdoStorePorc
不够灵活,没有用过。我现在试试它,稍后给你一些建议,也许能帮上你
的忙。
chris2019 2001-11-03
  • 打赏
  • 举报
回复
char 与 varchar??
偶试试
jjhaonou 2001-11-03
  • 打赏
  • 举报
回复
CREATE PROCEDURE login
@username varchar(20),
@passwd varchar(20)
as
select *
from pass
where username = @username and passwd = @passwd
GO
chris2019 2001-11-03
  • 打赏
  • 举报
回复
ado?bde,odbc偶还没玩转呢
问题是太简单了
反而让人找不出毛病
偶的声誉没问题
起码在delphi
adailee 2001-11-03
  • 打赏
  • 举报
回复
to:chris2019(牛虻——春风不问路):
似乎你的声誉不是很好。你的问题也不怎么难。
我就是那个再三劝诫你不要用TADOStoreProc的人。用TADODataSet可以灵活
处理你的问题,而且不会那么麻烦。

with ADODataSet1 do
begin
if Active then Close;
CommandText:='Exec login :UserName,:PassWd';
Parameters.ParamByName('UserName'):=Edit1.text;
Parameters.ParamByName('PassWd'):=Edit2.text;
Open;
if RecordCount>0 then
begin
...
end;
end;

chris2019 2001-11-03
  • 打赏
  • 举报
回复
有反映了,不过:
with storedproc1 do
begin
parambyname('@username').value:=edit1.text;
parambyname('@passwd').value:=edit2.text;
open;
if recordcount=1 then
button1.caption:='ok'
else
showmessage('no');

偶输入的明明就是正确的密码
非要保错
showmessage('no')
chris2019 2001-11-03
  • 打赏
  • 举报
回复
你还别不符
active设置于true,还是照样
jjhaonou 2001-11-03
  • 打赏
  • 举报
回复
Open和active为true等价。
我不是给你了修改方法吗?
chris2019 2001-11-03
  • 打赏
  • 举报
回复
偶该怎么改?
能否置active为true?
recordcount算不算返回了结果?
jjhaonou 2001-11-03
  • 打赏
  • 举报
回复
该怎么说你呢?
recordcount属性只有在Active为True的时候才有作用,所以第一次出
cannot perform this operation on a close dataset
而execproc只能在Active为False的时候才能执行,所以第二次出
cannot perform this operation on an open dataset

你的存储过程应该调用Open方法,而不是ExecProc方法。
chris2019 2001-11-03
  • 打赏
  • 举报
回复
还是delphi疯了
人家不饱错了
改为一点也不理会
你按按钮毫无反应
jjhaonou 2001-11-03
  • 打赏
  • 举报
回复
Delphi没疯,是你疯了。
改一下:
parambyname('@username').value:=edit1.text;
parambyname('@passwd').value:=edit2.text;
Open;
if recordcount=1 then
showmessage('ok');

830

社区成员

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

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