这是代码:procedure TForm1.btn1Click(Sender: TObject);
var
  str_paras ,str_para :string ;
  i ,int_pos :Integer ;
begin
  qry1.Close ;    qry1.SQL.Clear ;
    qry1.SQL.Add('SELECT CRM_Customer_idea.Idea_order_id ,(select customer_name from tss_customer where customer_code = crm_customer_idea.customer_code ) as customer_name  FROM CRM_Customer_idea  WHERE CRM_Customer_idea.Idea_order_id = :as_billid') ;    str_paras := edt1.Text ;
    for i:=0 to qry1.Parameters.Count-1 do begin
       int_pos :=Pos(';',str_paras);
       if int_pos <= 0 then
          str_para := str_paras
       else
          str_para := Copy(str_paras,1,int_pos);       qry1.Parameters[i].Value := str_para;
       qry1.Parameters[i].Size := Length(str_para) ;       str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
     end ;     qry1.Open;end;这是错误:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 77BA8FC4' in module 'msvcrt.dll' Write of address 012CB000'.
Project Project1.exe raised exception class EOLeException with message '存储空间不足,无法完成此操作.' Process Stopped调试错误产生在  qry1.SQL.Add 这句
并且如果我在这条sql的where字句加() 就没有问题 .如果不带字查询也没有问题请教各位大大,这是什么原因啊?

解决方案 »

  1.   

    兄弟﹐你把你where后面的參數設一下﹐
    WHERE CRM_Customer_idea.Idea_order_id = :as_billid') ; 
    我覺得在這種設置SQL.TEXT的時候應該就寫上傳入的參數了﹐而不是用:as_billid這種方式了。如果你把這SQL寫到qry1的SQL屬性中就應該沒問題﹐不過執行的時候可以這樣﹕
    ADOQuery1.Active:=false;
    ADOQuery1.Parameters.ParamByName('as_billid').value:=你的值;
    ADOQuery1.Active:=true;
      

  2.   

    那样不行。因为我这段代码本来是写在一个dll中供其他程序调用的。非delphi
    所以我的sql语句和parameter都是传参进来。您再看看我下面的代码,那里就是进行参数赋值的直接写在qry1.sql中确实没有问题,这正是我感到迷惑的地方.
      

  3.   

    var
      str_paras ,str_para :string ;
      i ,int_pos :Integer ;
    begin
      with qry1 do
      begin
        Close;
        sql.text := 'SELECT Idea_order_id ,'
                + '(select customer_name from tss_customer where customer_code = crm_customer_idea.customer_code ) as customer_name'
                + ' FROM CRM_Customer_idea WHERE (Idea_order_id = :as_billid)';    str_paras := edt1.Text ;
        for i:=0 to Parameters.Count-1 do
        begin
          int_pos :=Pos(';',str_paras);
          if int_pos  <= 0 then
            str_para := str_paras
          else
            str_para := Copy(str_paras,1,int_pos);
          Parameters[i].Value := str_para;
          Parameters[i].Size := Length(str_para) ;
          str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos);
        end;
        Open;
      end;
      

  4.   

    3楼的兄弟, 问题上我说明了 如果where 这里加上() 确实没有问题。
    但是我不明白这是为什么。因为程序发布的时候。什么SQL语句都可能产生,从语法上来说,这里不带()也是合法的,另外sql.text 的引号是发贴的时候他自动换行了
      

  5.   

    SQL语句没问题,
    数据库设置为空间自动增长试试
      

  6.   

    还是把SQL简化一下如下,你这个SQL效率应该有很大的问题的,并且我看了好久才明白是什么意思(也许水平不行,呵呵~)
      qry1.Close();
      qry1.SQL.Text := 
        'SELECT A.Idea_order_id, B.customer_name from ''#13#10+
        'CRM_Customer_idea A, tss_customer B'#13#10 +
        'where A.customer_code=B.customer_code and A.Idea_order_id=:as_billid';
      str_paras := edt1.Text;
    造成错误的原因可能是D在解析你的SQL中的参数时出现了异常另外,你那个循环解析赋参数值,好象有点问题,都带上了“;”
        str_paras := edt1.Text ; 
        for i:=0 to qry1.Parameters.Count-1 do begin 
           int_pos :=Pos(';',str_paras); 
           if int_pos  <= 0 then 
              str_para := str_paras 
           else 
              //str_para := Copy(str_paras,1,int_pos); 
               str_para := Copy(str_paras,1,int_pos-1);//应该不带";"号 
           qry1.Parameters[i].Value := str_para; 
           qry1.Parameters[i].Size := Length(str_para) ;        //str_paras :=Copy(str_paras,int_pos,Length(str_paras)- int_pos); 
            str_paras :=Copy(str_paras,int_pos + 1,Length(str_paras)- int_pos);//也不带";"     end ; 
      

  7.   

    TO :blazingfire 那个SQL是其他程序自动产生的,所以会那样。但是语法是一定没有错。
    我最怕就是这个异常,try也不能捕捉,直接后果就是调用这个dll的应用程序都死掉了。难道adoquery的解析能力这么差吗?
      

  8.   

    你的语句有问题 这样写子查询 会遍历 很多次
    如果只是关联两个表 用join就行了
    并且你这样写 返回的数据是 left join 的 而不是 inner join
    意思就是说 如果有一条数据 CRM_Customer_idea 表里有 而  tss_customer 表里没有
    也会返回数据 只是 customer_name的值是null
    不知道你是不是就打算要这样的结果
    把SQL换一下
     qry1.SQL.Add('SELECT a.Idea_order_id , b.customer_name from  CRM_Customer_idea a inner join tss_customer b on a.customer_code=b.customer_code
     and CRM_Customer_idea.Idea_order_id = :as_billid') ; 
    还有 delphi的string长度就255 SQL太长的话 象3楼那样用+号加起来
    PS: where后面的条件用括号括起来是个好习惯 :)
      

  9.   

    如果确定SQL没有问题。可以作一个如下简单的测试:
    var
      qry1: TADOQuery;
    begin
      qry1 := TADOQuery.Create(nil);
      qry1.ADOConnection := YourConnection;  
     ....
    end;
    如果不报错了,说明有可能是你qry1的问题(已经不存在的对象)。
    如果报错,说明可能真的是D或者ADO的问题,这个是最可怕!
      

  10.   

    看异常应该是ADO返回的 不如试试升级MDAC
      

  11.   

    源程序中 adoquery就是创建的. 
    明天到公司再做个简单的测试吧.哎头疼
      

  12.   

    目前测试仍无法通过为什么同样的语句直接写在.sql属性里可以,用add() 或.sql.text := 动态赋值却不行呢。欢迎大家继续讨论,为小弟解惑。节后放分谢谢
      

  13.   

    内存空间不足,可能是数据库空间不足的问题,数据库属性,数据文件-按文件自动增长
    或者你设置一下CacheSize