困扰多日的DELPHI+SQL SERVER主从表查询排序问题!

wangjun2000 2005-07-27 08:48:43
已经折腾很长时间了,实在黔驴技穷了!
1、SQL数据库的排序规则是CHINESE-PRC-CI-AI-KS-WS;

2、两个表分别是主库和详细资料库,均有编号字段,通过编号实现一对多关系。
两表字段除了smallint类型就是nvarchar类型,两表都没有加任何索引;

3、在DELPHI的Data Module中,放置两个AdoQuery,分别为AQ_MAIN,AQ_DETAIL。
程序通过ADO访问SQL SERVER。
AQ_MAIN 的SQL设置为:SELECT * FROM 主库;
AQ_DETAIL的SQL设置为:SELECT * FROM 详细资料库 WHERE 编号:=P_BH
其中P_BH为编号参数

4、在AQ_MAIN的AfterScroll事件中代码如下:
procedure Tdm_Main.AQ_MAINAfterScroll(DataSet: TDataSet);
begin
if NOT AQ_DETAIL.Active then AQ_DETAIL.Open ;
if AQ_MAIN.Active AND AQ_DETAIL.Active THEN
begin
AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value;
AQ_DETAIL.Requery([eoAsyncFetch]);//刷新数据
end;
end;

5、在表单中放置两个DBGRID,对应数据源分别为AQ_MAIN和AQ_DETAIL。
根据4中的代码,当在显示主库数据的表格中上下滚动时,显示详细资料库的表格应该会自动刷新。

问题现象:
1、在ACCESS数据库下上述代码完全正常。
2、升级到SQL SERVER后,在执行5时,只要主库数据记录指针移动(触发AfterScroll事件),就出现以下错误提示:
“不能比较或排序text、ntext和image数据类型,除非使用IS NULL或LIKE运算符”

让人困惑的是,数据表中没有任何索引,同时也确认没有text、ntext和image数据类型的字段。
排序规则我也换过,问题依然存在。

请教各位SQL SERVER和DELPHI高手伸出援手!

...全文
304 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
grjs2004 2005-08-06
  • 打赏
  • 举报
回复
AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=Trim(AQ_MAIN.FieldByName('编号').Asstring);

可能是存在空格的问题!
hqhhh 2005-08-01
  • 打赏
  • 举报
回复
把AQ_DETAIL的DataSource的属性设置为:与AQ_MAIN对应的DataSource,
不需要设置AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value;

当你设置上面的属性后,子表会自动增加P_BH字段值的!
78hgdong 2005-08-01
  • 打赏
  • 举报
回复
if NOT AQ_DETAIL.Active then AQ_DETAIL.Open ;
if AQ_MAIN.Active AND AQ_DETAIL.Active THEN
begin
AQ_DETAIL.close;
AQ_DETAIL.sql.clear;
AQ_DETAIL.sql.add('SELECT * FROM 详细资料库 WHERE 编号:=P_BH');
AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value;
AQ_DETAIL.Requery([eoAsyncFetch]);//刷新数据
end;
end;
wangjun2000 2005-07-29
  • 打赏
  • 举报
回复
to xbrave(咕嘟键):
你的这个思路我也试过的,不行的。再者,我个人认为如果只是要在移动记录时触发,就不该用datasource的datachange事件,因为与afterscroll相比,前者过于频繁,because it is triggered by all changes(the data in a record has changed, either due to field edits or moving the cursor to a new record)
lovend 2005-07-28
  • 打赏
  • 举报
回复
用left连接嘛

假设table1是成绩表,有学号,姓名,科目代号,成绩
table2表是科目表,有科目代号,科目名称

select a.学号,a.姓名,b.科目,a.成绩 from table1 a

left join table2 b on a.科目代号=b.科目代号
wangjun2000 2005-07-28
  • 打赏
  • 举报
回复
to xixuemao(俺可是㊣②㈧经儿滴人) :
sql语句无错,在access下正常运行,字段本身没有text、ntext或image类型,详细资料库对应的adoquery的sql语句中只是用了“where 编号=:P_bh”.
xbrave 2005-07-28
  • 打赏
  • 举报
回复
为什么不换种方式,在Datasouce_main的DataChange事件//或者DbEdit1的Change事件中写
with Adoquery2 do
begin
close;
sql.Clear;
sql.Add('select * from 从表');
sql.Add('where 编号='+''''+DBEdit1.text+'''');//DBEdit1连接主表编号字段
open;
end;
wangjun2000 2005-07-28
  • 打赏
  • 举报
回复
to grjs2004(在岸边钓不到大鱼,只好下水去摸虾米!) :
不幸,asstring我早试过,还是不行的。

to opqhjb(阿宝):
sql查询语句我用的是标准sql,没敢用扩展的sql,语句本身没有任何问题。
xixuemao 2005-07-28
  • 打赏
  • 举报
回复
“不能比较或排序text、ntext和image数据类型,除非使用IS NULL或LIKE运算符”
它既然这么提示就说名你的SQL有错误,你设置个断点 看看你的SQL运行后到底是什么?
opqhjb_2002 2005-07-28
  • 打赏
  • 举报
回复
我觉得就是你查询语句有问题嘛!有些数据库是不兼容的。
grjs2004 2005-07-28
  • 打赏
  • 举报
回复
AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value

改成

AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').AsString

试试看!
wangjun2000 2005-07-28
  • 打赏
  • 举报
回复
to lovend(颓废之吻) :你误解了我的意思,我不是要那样jion输出,现在就是要一对多的查看,主数据变化,就能自动刷新对应的详细数据。

2,497

社区成员

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

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