代码如下:unit read;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBCtrls, Mask, ExtCtrls;type
 TOwnBook=record
 Code : String;
 Name : String;
 Price : String;
 OwnDays : integer;
 end;    TLendForm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Panel2: TPanel;
    Panel1: TPanel;
    ComboBox1: TComboBox;
    Panel3: TPanel;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    StaticText7: TStaticText;
    StaticText8: TStaticText;
    StaticText9: TStaticText;
    StaticText10: TStaticText;
    StaticText11: TStaticText;
    StaticText0: TStaticText;
    DBName: TDBEdit;
    DBAuthor: TDBEdit;
    DBPress: TDBEdit;
    DBOutDate: TDBEdit;
    DBCost: TDBEdit;
    DBMemo: TDBMemo;
    ReaderIDEdit: TEdit;
    TotalEdit: TEdit;
    OwnTimeEdit: TEdit;
    FineEdit: TEdit;
    ADOConnection1: TADOConnection;
    tempADOQuery1: TADOQuery;
    tempADOQuery2: TADOQuery;
    DataSource1: TDataSource;
    ADOTable1: TADOTable;
    ADOQuery1: TADOQuery;
    procedure FormShow(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ReaderIDEditChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  LendForm: TLendForm;implementationuses ownbook;{$R *.dfm}procedure TLendForm.FormShow(Sender: TObject);
var
i: integer ;
begin
  with ADOQuery1  do
  begin
  close;
  SQL.Clear;
  SQL.Add('select code from book');
  Open ;
  First;
  for i:=0 to RecordCount-1 do
  begin
    ComboBox1.Items.Add(FieldbyName('code').AsString);
    Next;
  end;
  Close;
 end;end;procedure TLendForm.ComboBox1Change(Sender: TObject);
var
FDate : TDate;
OwnTime : TDate ;
begin
  ReaderIDEdit.Text:='';
  TotalEdit.Text:='';
  OwnTimeEdit.Text :='';
  FineEdit.Text:='';
  if  Length(ComboBox1.Text) =10 then
  begin
    try
    with  ADOTable1 do
    begin
      TableName :='book';
      DBOutDate.DataField := 'outdate' ;
      DBName.DataField := 'name' ;
      DBAuthor.DataField := 'author' ;
      DBPress.DataField := 'press' ;
      DBCost.DataField := 'cost' ;
      DBMemo.DataField := 'memo' ;
      Active := True;
      if not Locate('code' ,ComboBox1.Text,[]) then
      begin
        MessageDlg('没有数据或数据库操作失败',mtError, [mbok], 0);
        panel1.Visible := False ;
        Exit;
      end;
      panel1.Visible := True;
    end;
 except
    MessageDlg('数据操作出错',mtError, [mbok], 0);
 end;  try
    with  ADOQuery1 do
    begin
    close;
    SQL.Clear;
    SQL.Add('select * from lend where Code =:Code');
    Parameters.ParamByName('code').Value :=ComboBox1.Text ;
    Open;    if  RecordCount <> 0 then
    begin
      FDate := FieldByName('outdate').AsDateTime;
      OwnTime :=Date - FDate ;
      OwnTimeEdit.Text :=FloatToStr(OwnTime) ;
      ReaderIDEdit.Text := FieldByName('readerid').AsString;
      StaticText10.Visible :=True ;
      OwnTimeEdit.Visible := True ;      if StrToInt(OwnTimeEdit.Text)>60 then
      begin
        StaticText11.Visible :=True;
        FineEdit.Visible :=True ;
        FineEdit.Text := FloatToStr((StrToInt(OwnTimeEdit.Text)-60)*0.1);
      end;
      Button1.Enabled := False ;
      Button2.Enabled := True ;
      Button2.SetFocus;
      Close ;
    end
    else begin
            ReaderIDEdit.SetFocus;
            Button1.Enabled := True;
            Button2.Enabled := False ;
         end;
  end;
 except
   ReaderIDEdit.SetFocus;
 end;
 end;
end;procedure TLendForm.Button3Click(Sender: TObject);
begin
Close;
end;
    
procedure TLendForm.Button2Click(Sender: TObject);
begin
  try
    with  ADOQuery1 do
    begin      SQL.Clear;
      SQL.Add('delete * from lend where code =: '''+ComboBox1.Text+'''');
      //Parameters.ParamByName('code').Value:=ComboBox1.Text;
      ExecSQL;
      Close;
    end;
  except
    MessageDlg('还书不成功',mtError,[mbok],0);
  end;   ReaderIDEdit.Text :='';
   TotalEdit.Text :='';
   OwnTimeEdit.Text :='';
   FineEdit.Text :='';
   Panel1.Visible := False;end;procedure TLendForm.Button1Click(Sender: TObject);
var
tempOwnBook :TOwnBook ;
CanLend :Boolean;
mmcode: string;begin
  if  ReaderIDEdit.Text<>'' then
  begin
  try
    with  ADOQuery1 do
    begin
      close;
      SQL.Clear;
      SQL.Add('select code from lend where readerid =: '''+ReaderIDEdit.Text+'''');
      //Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
      Open;
      CanLend :=True ;
      OwnBookForm.ListView1.Items.Clear;
      mmcode := fieldbyname('code').AsString;
      while not Eof do
      begin
         with  tempADOQuery1  do
         begin
         SQL.Clear;
         SQL.Add('select * from book where code =:code');
         Parameters.ParamByName('code').Value:=ADOQuery1.FieldByName('code').AsString;
         Open;
         tempOwnBook.Code := FieldByName('code').AsString;
         tempOwnBook.Name := FieldByName('Name').AsString;
         tempOwnBook.Price := FieldByName('Price').AsString;
         try
            with tempADOQuery2 do
            begin
               close;
               SQL.Clear;
               SQL.Add('select * from lend where code =:code  and readerid =:readerid');
               Parameters.ParamByName('code').Value:=ADOQuery1.FieldByName('code').AsString;
               Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
               Open;
               tempOwnBook.OwnDays :=Round(Date-FieldByName('outdate').AsDateTime);
               Close;
        end;
      except
        tempOwnBook.OwnDays := 0 ;
      end;
      Close;
    end;    if tempOwnBook.OwnDays >60 then
    begin
        with OwnBookForm.ListView1.Items.Add   do
        begin
        Caption := tempOwnBook.Code;
        SubItems.Add(tempOwnBook.Name);
        SubItems.Add(tempOwnBook. Price);
        SubItems.Add(IntToStr(tempOwnBook.OwnDays));
        SubItems.Add(FloatToStr((tempOwnBook.OwnDays-60)*0.1));
        end;
        CanLend :=False ;
      end;
        Next ;
     end;
          Close;
     end ;
 except
        CanLend :=False ;
 end;        if  CanLend =False   then
        begin
        OwnBookForm.Caption :=ReaderIDEdit.Text+'有以下书籍没有按时归还';
        OwnBookForm.ShowModal;
        exit;
        end;        try
        with  ADOQuery1 do
        begin
          close;
          SQL.Clear;
          SQL.Add('insert into lend(code,readerid,outdate) '+' values(:code, :readerid , :outdate)');
          Parameters.ParamByName('code').Value := ComboBox1.Text;
          Parameters.ParamByName('readerid').Value := ReaderIDEdit.Text;
          Parameters.ParamByName('OutDate').Value := DateToStr(now());
          ExecSQL;
          end;
        except
          MessageDlg('借书不成功',mtError,[mbok],0);
        end;        Panel1.Visible :=False ;
          end
          else begin
                 showMessage('请输入借书证号');
                 ReaderIDEdit.Setfocus;
               end;
end;procedure TLendForm.ReaderIDEditChange(Sender: TObject);
begin
  if Length(ReaderIDEdit.Text) = 10 then
  begin
  with   ADOQuery1 do
  begin
    close;
    SQL.Clear;
    SQL.Add('select readerid from reader where readerid =:'''+ReaderIDEdit.Text+'''');
    //Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
    Open;
    if   RecordCount =0 then
    begin
      Button1.Enabled := False ;
      MessageDlg('借书证号<'+ReaderIDEdit.Text+'>不存在',mtError,[mbok],0);
      Close;
      Exit;
    end;
    Close;
  end;  try
     with   ADOQuery1 do
     begin
       close;
       SQL.Clear;
       SQL.Add('select Count(readerid) from lend where readerid =:readerid');
       Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
       Open;
       TotalEdit.Text :=IntToStr(Fields[0].value);
       Close;
     end;
   except
     TotalEdit.Text :='0';
   end;   Button2.Enabled :=False;
   Button1.Enabled := True ;
   Button1.SetFocus;
  end;
end;end.这是图书馆借书的代码,每次我输入借书证号的时候就显示“借书证号<0070601145>不存在” ,但我的SQL2000 数据表中已经有这个借书证号,我输入10位借书证号的时候老是显示不存在,不管数据表中已有借书证号还是没有,我不知道错在哪里,望哪位大虾可以帮忙下。

解决方案 »

  1.   

    SQL.Add('select readerid from reader where readerid =:'''+ReaderIDEdit.Text+'''');
    改成
    SQL.Add('select readerid from reader where readerid ='''+ReaderIDEdit.Text+'''');
    或者
    SQL.Add('select readerid from reader where readerid =:s1');
    Parameters.ParamByName('s1').Value:=ReaderIDEdit.Text;
      

  2.   

    谢谢,刚刚的问题已解决,刚刚的问题,加冒号和不加冒号有什么区别么?因为我是第一次接触Delphi,代码基本上是参考书本的。但是我现在按“借出”键的时候出现“0070601145附近有语法错误,不知道具体怎么改
      

  3.   

    sql语句中
    =后加:的是指=后面是参数,需要通过 Parameters.ParamByName('s1').Value:=***语句赋值
    把你“借出”按钮代码贴出来,应该还是sql语句有问题
      

  4.   

    procedure TLendForm.Button1Click(Sender: TObject);
    var
    tempOwnBook :TOwnBook ;
    CanLend :Boolean;
    mmcode: string;begin
      if ReaderIDEdit.Text<>'' then
      begin
      try
      with ADOQuery1 do
      begin
      close;
      SQL.Clear;
      SQL.Add('select code from lend where readerid =: '''+ReaderIDEdit.Text+'''');
      //Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
      Open;
      CanLend :=True ;
      OwnBookForm.ListView1.Items.Clear;
      mmcode := fieldbyname('code').AsString;
      while not Eof do
      begin
      with tempADOQuery1 do
      begin
      SQL.Clear;
      SQL.Add('select * from book where code =:code');
      Parameters.ParamByName('code').Value:=ADOQuery1.FieldByName('code').AsString;
      Open;
      tempOwnBook.Code := FieldByName('code').AsString;
      tempOwnBook.Name := FieldByName('Name').AsString;
      tempOwnBook.Price := FieldByName('Price').AsString;
      try
      with tempADOQuery2 do
      begin
      close;
      SQL.Clear;
      SQL.Add('select * from lend where code =:code and readerid =:readerid');
      Parameters.ParamByName('code').Value:=ADOQuery1.FieldByName('code').AsString;
      Parameters.ParamByName('readerid').Value:=ReaderIDEdit.Text;
      Open;
      tempOwnBook.OwnDays :=Round(Date-FieldByName('outdate').AsDateTime);
      Close;
      end;
      except
      tempOwnBook.OwnDays := 0 ;
      end;
      Close;
      end;  if tempOwnBook.OwnDays >60 then
      begin
      with OwnBookForm.ListView1.Items.Add do
      begin
      Caption := tempOwnBook.Code;
      SubItems.Add(tempOwnBook.Name);
      SubItems.Add(tempOwnBook. Price);
      SubItems.Add(IntToStr(tempOwnBook.OwnDays));
      SubItems.Add(FloatToStr((tempOwnBook.OwnDays-60)*0.1));
      end;
      CanLend :=False ;
      end;
      Next ;
      end;
      Close;
      end ;
     except
      CanLend :=False ;
     end;  if CanLend =False then
      begin
      OwnBookForm.Caption :=ReaderIDEdit.Text+'有以下书籍没有按时归还';
      OwnBookForm.ShowModal;
      exit;
      end;  try
      with ADOQuery1 do
      begin
      close;
      SQL.Clear;
      SQL.Add('insert into lend(code,readerid,outdate) '+' values(:code, :readerid , :outdate)');
      Parameters.ParamByName('code').Value := ComboBox1.Text;
      Parameters.ParamByName('readerid').Value := ReaderIDEdit.Text;
      Parameters.ParamByName('OutDate').Value := DateToStr(now());
      ExecSQL;
      end;
      except
      MessageDlg('借书不成功',mtError,[mbok],0);
      end;  Panel1.Visible :=False ;
      end
      else begin
      showMessage('请输入借书证号');
      ReaderIDEdit.Setfocus;
      end;
    end;
    恩,学习了。这是借出的代码,但是我老是调试不成功,刚刚检查的时候,按借出键的时候,显示的是“access violation at address 004B3454 in model'bookmanager.exe'"是这样的错误,然后直接跳到了“ OwnBookForm.ListView1.Items.Clear;”这句话和“except
      CanLend :=False ;
     end;”这里有错
      

  5.   

    跳到这句话的时候就出错了“OwnBookForm.ShowModal;“
      

  6.   

    恩,我把改好后的给你看看
    procedure TLendForm.Button1Click(Sender: TObject);
    var
      tempOwnBook : TOwnBook;
      canland : boolean;
    begin
      if  ReaderIDEdit.Text <>'' then
      begin
      try
        with ADOQuery1 do
        begin
          SQL.Clear;
          SQL.Add('select Code from Lend where ReaderID =:ReaderID');
          Parameters.ParamByName('ReaderID').Value := ReaderIDEdit.Text;
          Open;
          CanLand := True;
          OwnBookForm.ListView1.Items.Clear;
          while not Eof do
          begin
            with tempADOQuery1 do
            begin
              SQL.Clear;
              SQL.Add('select * from Book where Code =:Code');
              Parameters.ParamByName('Code').Value :=
                        ADOQuery1.FieldByName('Code').AsString;
              Open;
              tempOwnBook.Code := FieldByName('Code').AsString;
              tempOwnBook.Name :=  FieldByName('Name').AsString;
              tempOwnBook.Price :=  FieldByName('Cost').AsString;          try
                with tempADOQuery2 do
                begin
                  SQL.Clear;
                  SQL.Add('select * from Lend where Code = :Code and ReaderID =:ReaderID');
                  Parameters.ParamByName('Code').Value :=
                         ADOQuery1.FieldByName('Code').AsString;
                  Parameters.ParamByName('ReaderID').Value := ReaderIDEdit.Text;
                  Open;
                  tempOwnBook.OwnDays := Round(Date-FieldByName('OutDate').AsDateTime);
                  Close;
                end;
              except
                tempOwnBook.OwnDays := 0;
              end;
              Close;
            end;        if tempOwnBook.OwnDays >60 then
            begin
              with OwnBookForm.ListView1.Items.Add do
              begin
                Caption := tempOwnBook.Code;
                SubItems.Add(tempOwnBook.Name);
                SubItems.Add(tempOwnBook.Price);
                SubItems.Add(IntToStr(tempOwnBook.OwnDays));
                SubItems.Add(FloatToStr((tempOwnBook.OwnDays-60)*0.1));
              end;
              CanLand := False;
            end;
          Next;
        end;
          Close;
        end;
      except
        CanLand := False;
      end;  if CanLand = False then
      begin
        OwnBookForm.Caption := ReaderIDEdit.Text+'有以下书籍没按时归还';
        OwnBookForm.ShowModal;
        Exit;
      end;  try
        with ADOQuery1 do
        begin
          SQL.Clear;
          SQL.Add('insert into Lend'+'  values(:Code,:ReaderID,:OutDate)');
          Parameters.ParamByName('Code').Value := ComboBox1.Text;
          Parameters.ParamByName('ReaderID').Value:=ReaderIDEdit.Text;
          Parameters.ParamByName('OutDate').Value := DateToStr(now);
          ExecSQL;
        end;
      except
        MessageDlg('借书不成功',mtError,[mbok],0);
      end;  Panel1.Visible := False;
      end
      else begin
             ShowMessage('请输入借书证号!');
             ReaderIDEdit.Setfocus;
           end;
    end;
    按借出键的时候,显示的是“access violation at address 004B3454 in model'bookmanager.exe'"是这样的错误,跳到这句话“OwnBookForm.ShowModal;”的时候就出现了上面这个错误
      

  7.   

    应该是OwnBookForm未创建或者OwnBookForm窗体OnShow事件代码有问题
      

  8.   

    tempOwnBook : TOwnBook;这是个类啊,呵呵,好多的代码,看的头晕.你要不把类去掉看一下,会不会是类用的不当造成的.如果真是你新建的类,那么里面就没有创建,没创建按理是不能引用的啊.只是想像.
      

  9.   

    OwnBookForm我有创建的,它只是辅助显示那些没有归还的书的,而且我OwnBookForm窗体中没有onshow事件
      

  10.   

    请问你的邮箱是多少,我把我做的发给你看看吧,我自己改不出来,这是我第一次用Delphi
      

  11.   

    将 SQL.Add('select code from lend where readerid =: '''+ReaderIDEdit.Text+'''');
    改成:
    SQL.Add('select code from lend where readerid =:ReaderID');
      Parameters.ParamByName('ReaderID').Value:=trim(ReaderIDEdit.Text);