各位老大,请问我的下列代码问题出在哪?query1.SQL.add('select 姓名,性别 from hyzl');
query1.sql.add('where 姓名=''孙林''');
query1.Open;
query1.FieldValues['姓名']:=edit1.text;编译也能通过,执行时提示:
Project project1.exe raised exception class EDBEngineError with message
'Insufficien memory for this operratin
Alias hj process stopped .use step or run to continue.
主要是加了最后一句才有这个提示,其中“hj”我的ODBC名。
另外还有一个小问题,就是那个条件后面的姓名值为什么要加两个单引号,在SQL Server 的查询分析器中却只要一个呀?还有若姓名值是“'孙林'”,即外面加单引号,在查询分析器中只要加三个单引号即 select * from hyzl where 姓名='''孙林'''就能实现,可在Delphi的query构件没有办法实现?

解决方案 »

  1.   

    query1.SQL.add('select 姓名,性别 from hyzl');
    query1.sql.add('where 姓名=''孙林''');
    query1.Open;
    query1.append;query1.FieldValues['姓名']:=edit1.text在sql直接运行,而在delphi先把他当字符传呢,外面多写''了,里面自然改变
      

  2.   

    >>>>>Project project1.exe raised exception class EDBEngineError with message
    'Insufficien memory for this operratin
    Alias hj process stopped .use step or run to continue.關于上面的錯誤信息主要是由自己導致的.
    最常見的比如你按F9運行程序後不調用窗體的Close方法, 而直接按Ctrl+F2強行中斷! 這樣反復五次左右最會出現上現异常, 你必需重新啟動Delphi.固計主要原因為內存泄漏, 也許是Delphi的bug.
    治標的方法是不要按Ctrl+F2強行中斷程序!!!!>>>>>
    query1.Open;
    query1.FieldValues['姓名']:=edit1.text;
    上面的代碼也有問題, 樓上的正确
      

  3.   

    with query1 do
      begin
        sql.clear
        sql.add('select 姓名,性别 from hyzl');
        sql.add(' where 姓名=''孙林''');
        open;
        edit;
        fieldbyname('姓名').value:=edit1.text;
        post;
      end;
      

  4.   

    whbo(王红波(以后不能午休了)) :
    在sql直接运行,而在delphi先把他当字符传呢,外面多写''了,里面自然改变
     
    是呀,先当字符串,外面多写了'',是指整个个SQL语句外面都用单引号括起来,可那个姓名的值为什么要用两个单引号呢?似乎是这样才对: 
    sql.add(' where 姓名='孙林'');
      

  5.   

    '''' 是字符 '
    select 姓名,性别 from hyzl where 姓名='孙林''select 姓名,性别 from hyzl where 姓名=''孙林'''
      

  6.   

    gxgyj(杰克.逊) :
    OK!加一个edit就通过了!谢谢,但是还有一个小问题就是引号的问题小弟还是不明白?
      

  7.   

    我认为似乎应该是 'select 姓名,性别 from hyzl where 姓名='孙林''才对!
    而且我反复试了多次,若将姓名在SQL Server中改成用单引号括起来即'孙林',在SQL Server中可以执行:select 姓名,性别 from hyzl where 姓名='''孙林''',即“若字符串中含有引号,可用两个引号括起来”,但是Delphi我却没有办法实现!这其实是小问题,想信也没有哪个无聊的家伙在姓名值中加入引号,只是小弟一向喜欢研究一些细节问题,请不吝赐教!
      

  8.   

    我也试了一下,也不行。
    在设计时将sql设为:select * from aa where xm='abc'是可以查出xm为'abc'的记录。
    但用sql.add时就不行了。提示语法错,它会认为是:select * from aa where xm="abc"
    为了避免这种情况,楼主就用aa like '%abc%'这样好了,查询所有aa字段中包含有abc的记录.
      

  9.   

    上面打错了,应为:
    在设计时将sql设为:select * from aa where xm='''abc'''是可以查出xm为'abc'的记录。
      

  10.   

    query1.SQL.add('select 姓名,性别 from hyzl');
    query1.sql.add(' where 姓名=''孙林''');  //注意有空格
    query1.Open;
    query1.edit;
    query1.FieldByName('姓名').asstring:=edit1.text;
    query1.post;
      

  11.   

    等等,经过几次试验之后。我要说声‘对不起’。
    上面我错了,用下面的:
    adoquery1.SQL.Add('select * from aa where xm='+''''+'''''abc'''''+'''');
    是可以查出xm为'abc'的记录。对不起啊!!!
      

  12.   

    TKS!能否详细介绍一下+的用法呀?我曾看到过类似下面的代码(无关的略去),主要是搞不懂+的用法,请指教:
     dlid:=edi1.text
     query1.sql.add('select * from aa where ID='''+dlid+'''');
    为什么query1.sql.add('select * from aa where ID=edit1.text);
    或者query1.sql.add('select * from aa where ID=dlid);就不行呢,要知道在SQL Server中可以执行的呀?请指教!
      

  13.   

    假设edit1.text为abc,即dlid就为abcquery1.sql.add('select * from aa where ID='''+dlid+'''');//相当于select * from aa where id='abc'
    //不知你是否明白
      

  14.   

    这么这个+与以前的学过的FoxBASE中的&差不多?我也知道他相当于下面的语句,只是不知能否告诉+语法规则?
      

  15.   

    但是无法解释上边的问题呀?这只是小问题,我不想再伤脑筋了!还有,我在另一个程序里同样出现第一个的错误提示,不妨把源程序给你看一下:
    unit dl;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, DBTables;type
      TdlForm = class(TForm)
        GroupBox1: TGroupBox;
        RB1: TRadioButton;
        RB2: TRadioButton;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Cancel: TButton;
        OK: TButton;
        Database1: TDatabase;
        Table1: TTable;
        Table2: TTable;
        Query1: TQuery;
        procedure RB1Click(Sender: TObject);
        procedure RB2Click(Sender: TObject);
        procedure OKClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      dlForm: TdlForm;implementation{$R *.dfm}procedure TdlForm.RB1Click(Sender: TObject);
    begin
    if RB1.Checked=False then
      begin
      RB1.Checked:=True;
      RB2.Checked:=False;
      end;
      Edit1.Enabled:=True;
      Edit2.Enabled:=True;
      Edit1.Color:=clWindow;
      Edit2.Color:=clWindow;
    end;procedure TdlForm.RB2Click(Sender: TObject);
    begin
     if RB2.Checked=False then
     begin
     RB2.Checked:=True;
     RB1.Checked:=False;
     end;
    Edit1.Enabled:=False;
    edit2.Enabled:=False;
    Edit1.Color:=clMenu;
    edit2.Color:=clMenu;
    end;procedure TdlForm.OKClick(Sender: TObject);
    var IsHy:boolean;
    dlhyid,dlzxb:string;
    begin
      IsHy:=RB1.Checked;
     if IsHy then
      if (edit1.Text='') then
       edit1.SetFocus
      else
     begin
      dlhyid:=Edit1.Text;
      query1.close;
      query1.sql.clear;
      query1.sql.add('select 会员ID,口令,性别 from hyzl');
      query1.sql.add('where 会员ID=dlhyid');//这里我没有用'''+dlhyid+''''
      query1.Open;
      query1.Edit;//这个东东也加了;
    //验证会员口令,问题就出在这儿!
     if (query1.RecordCount<>1)or(edit2.text<>query1.fieldvalues['口令']) then
      begin
       showMessage('会员号或口令不对,请检查。');
       edit2.SetFocus;
      end
     else
      showMessage('登录成功');
      dlzxb:=query1.fieldvalues['性别'];
    end;
     end;end.
    这个程序我并没有写完,只是写一部分调试后再另外的,但却出了问题,不知道为什么!主要是一个登录界面,错误提示除'cannot find object ,',外其作相同,不知为什么,烦死了。
      

  16.   

    procedure TdlForm.OKClick(Sender: TObject);
    var 
      IsHy:boolean;
      dlhyid,dlzxb:string;
    begin
      IsHy:=RB1.Checked;
    if IsHy then
      if (edit1.Text='') then
        edit1.SetFocus
      else
        begin
          dlhyid:=Edit1.Text;
          query1.close;
          query1.sql.clear;
          query1.sql.add('select 会员ID,口令,性别 from hyzl');
          query1.sql.add(' where 会员ID=:temp');//注意前面空一格
          query1.Parameters.ParamByName('temp').value:=dlhyid;//使用参数赋值
          query1.Open;
          //query1.Edit;这里只要查询,query1.edit就不需要了
          if (query1.RecordCount<>1) or (edit2.text<>query1.fieldbyname('口令').value) then
            begin
              showMessage('会员号或口令不对,请检查。');
              edit2.SetFocus;
            end
          else
            begin
              showMessage('登录成功');
              dlzxb:=query1.fieldbyname('性别').vaule;
            end;
        end;//end edit1.text<>''
    end;//end ishy=trueend;//不知楼主是不是这个意思....
      

  17.   

    不知你上面是不是有写法完全正确,还是写个概要?提示有语法错误
    query1.Parameters.ParamByName('temp').value:=dlhyid;[Error] dl.pas(83): Undeclared identifier: 'parameters'
    [Error] dl.pas(83): Missing operator or semicolon
    [Error] dl.pas(83): Missing operator or semicolon
    [Fatal Error] dlproject.dpr(5): Could not compile used unit 'dl.pas'
      

  18.   

    对不起,这个:query1.Parameters.ParamByName('temp').value:=dlhyid;是adoquery的用法。
    query换这个:
    query1.Params.ParamByName('temp').value:=dlhyid;
      

  19.   

    可以运行,不过输入正确的ID也提示ID不对,明显是没有执行Else下面的语句,而且多执行几次又出了很多陌生的系统错误,估计是SQL Server中的配置问题,谢谢你了,结帖!!!