已经折腾很长时间了,实在黔驴技穷了!
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高手伸出援手!

解决方案 »

  1.   

    用left连接嘛假设table1是成绩表,有学号,姓名,科目代号,成绩
    table2表是科目表,有科目代号,科目名称select a.学号,a.姓名,b.科目,a.成绩 from table1 a left join table2 b on a.科目代号=b.科目代号
      

  2.   

    to lovend(颓废之吻) :你误解了我的意思,我不是要那样jion输出,现在就是要一对多的查看,主数据变化,就能自动刷新对应的详细数据。
      

  3.   

    “不能比较或排序text、ntext和image数据类型,除非使用IS NULL或LIKE运算符”
    它既然这么提示就说名你的SQL有错误,你设置个断点 看看你的SQL运行后到底是什么?
      

  4.   

    to  xixuemao(俺可是㊣②㈧经儿滴人) :
    sql语句无错,在access下正常运行,字段本身没有text、ntext或image类型,详细资料库对应的adoquery的sql语句中只是用了“where 编号=:P_bh”.
      

  5.   

    AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value改成AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').AsString试试看!
      

  6.   

    to grjs2004(在岸边钓不到大鱼,只好下水去摸虾米!) :
    不幸,asstring我早试过,还是不行的。to opqhjb(阿宝):
    sql查询语句我用的是标准sql,没敢用扩展的sql,语句本身没有任何问题。
      

  7.   

    为什么不换种方式,在Datasouce_main的DataChange事件//或者DbEdit1的Change事件中写
     with Adoquery2 do  
      begin
         close;
         sql.Clear;
         sql.Add('select * from 从表');
         sql.Add('where 编号='+''''+DBEdit1.text+'''');//DBEdit1连接主表编号字段
         open;
       end;
      

  8.   

    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)
      

  9.   

    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;
      

  10.   

    把AQ_DETAIL的DataSource的属性设置为:与AQ_MAIN对应的DataSource,
    不需要设置AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=AQ_MAIN.FieldByName('编号').Value;当你设置上面的属性后,子表会自动增加P_BH字段值的!
      

  11.   

    AQ_DETAIL.Parameters.ParamByName('P_BH').Value :=Trim(AQ_MAIN.FieldByName('编号').Asstring);可能是存在空格的问题!