Database 使用Delphi中的现有数据库将交叉引用数据写入文本文件?

Database 使用Delphi中的现有数据库将交叉引用数据写入文本文件?,database,delphi,delphi-7,Database,Delphi,Delphi 7,我正在尝试将写入文本文件的数据与现有数据库交叉引用(检查写入文本文件的数据是否已存在于数据库中) 我已经创建了将用户登录数据(名称和密码)写入文本文件的程序,然后我开始编写从文本文件读取数据的算法,但我有点卡住了,我将名称存储在文本文件的第一行,将密码(仅字符串值)存储在下一行 我不知道如何检查数据库中是否已经存在此数据,是否需要首先提取数据库的内容?或者你可以直接与数据库交叉引用吗?我已经创建了数据库(UserData.accdb),但还没有将其链接到表单。这就是我到目前为止所做的: proc

我正在尝试将写入文本文件的数据与现有数据库交叉引用(检查写入文本文件的数据是否已存在于数据库中)

我已经创建了将用户登录数据(名称和密码)写入文本文件的程序,然后我开始编写从文本文件读取数据的算法,但我有点卡住了,我将名称存储在文本文件的第一行,将密码(仅字符串值)存储在下一行

我不知道如何检查数据库中是否已经存在此数据,是否需要首先提取数据库的内容?或者你可以直接与数据库交叉引用吗?我已经创建了数据库(UserData.accdb),但还没有将其链接到表单。这就是我到目前为止所做的:

procedure TForm1.btnclickClick(Sender: TObject);

var
 tRegister      :    TextFile;
 Sline          :    String;
 Sname,SPword   :    String;

begin
  Assignfile(tRegister,'register.txt');

Try
 Reset(tRegister);

 except
   Showmessage('File Register.txt does not exist');
   Exit;
 end;

 While not EOF(tRegister) do
   ReadLn(tRegister,Sline);
     Sname:=Copy(Sline);

      // This is where i want to add code 

      end;



   end;

end.

请不要太苛刻,我还是Delphi新手:)

我从您的问题中了解到,您目前一直在尝试检查数据库中是否存在特定记录。我将非常简短地回答这个问题,因为在这个网站上有很多类似的问题可以帮助你充实细节

但是,您问题的标题询问“使用现有数据库将交叉引用数据写入文本文件”。从描述上看,似乎您正在尝试协调来自两个源的数据,并找出哪些匹配,哪些不匹配。我会花更多的时间回答这个问题,因为我认为会有更多有价值的信息


要检查数据库中的数据,您需要:
  • 配置为指向数据库的连接组件
  • 链接到连接组件的查询组件
  • 查询文本将使用SQL语句从数据库中的特定表中选择行
  • 我建议将查询参数化,以便专门选择要查找的行(稍后我将解释原因)
  • 注意:您可以使用表组件而不是查询组件,这将改变您检查现有行的方式。它的优点是您不需要编写SQL代码。但是编写良好的SQL将具有更大的可伸缩性
上面的选项因您使用的数据库和组件而异。但正如我所说,已经有许多类似的问题。通过一点研究,你应该能够弄明白

如果你陷入困境,你可以问一个更具体的问题,详细说明你尝试了什么,什么不起作用。(请记住,这不是一个免费的“为你做你的工作”服务,如果这看起来是你所期望的,你会受到强烈反对。)


协调文本文件和数据库之间的数据: 有几种不同的方法。你选择的那一个是可以接受的。基本上可以归结为:

  • 对于文件中的每个
    条目
  • 。。如果数据库中存在
    条目
  • 。。使用
    条目执行操作
  • 。。否则,请使用
    条目执行其他操作
  • 以上步骤很容易理解,因此很容易确信算法是正确的。如果Delphi中没有一行程序来实现这些步骤,这并不重要。作为程序员,您有权创建所需的任何附加函数/过程。 保持例程的结构简单是很重要的

    上面的任何一个步骤都不能简单地实现,然后您需要分解成更小的步骤:2.a。2.b;3.a。3.b。3.c;等等。(这就是自上而下设计的含义。)

    提示:您希望将所有不同的细分转换为各自的函数和过程。这将使维护程序和重用已经编写的例程变得更加容易

    我将专注于分解步骤2。如果您的数据库和文本文件变得相当大,那么如何做到这一点非常重要。例如,您可以这样实现:每次调用函数检查“if
    Entry
    exists”,它都会查看数据库中的每一条记录。这将是非常糟糕的,因为如果您的文件中有
    m
    条目,并且数据库中有
    n
    条目,那么您将进行
    m x n
    检查

    记得我说过我会解释为什么我建议使用参数化查询吗

    数据库是为管理数据而设计和编写的。存储和检索数据是它们的主要功能,所以让它来完成查找您要查找的条目是否存在的工作。例如,如果您编写查询以将所有条目提取到Delphi应用程序中并在其中搜索:

    • 增加应用程序的内存需求
    • 但更重要的是,如果不做额外的工作,你就会面临上面提到的
      mxn
      问题
    使用参数化查询,每次调用
    if EntryExists(…)
    时,您都可以更改参数值,并有效地要求数据库查找记录。数据库完成了这项工作,并为您提供了答案。例如,您可以按如下方式编写函数:

    function TForm1.EntryExists(const AName: string): Boolean;
    begin
      qryFindEntry.Close;
      qryFindEntry.Parameters.ParamByName('EntryName').Value := AName;
      qryFindEntry.Open;
    
      Result := qryFindEntry.RecordCount > 0;
    end;
    
    提示:在数据库中的适当列上定义索引非常重要,否则每次打开查询时,它也会搜索每条记录

    注意:另一个非常类似的选项是在数据库上编写存储过程,并使用存储过程组件调用数据库


    补充意见: 您处理文件的例程已硬编码为使用
    register.txt

    这使得它不能以当前形式重用。而是将代码移动到一个单独的方法中:
    procedure-ProcessFile(AFileName:string)。然后在按钮cli中
    
    try
      Reset(tRegister);
    except
      on E: Exception do
      begin
        //Note that the message doesn't make any assumptions about the cause of the error.
        E.Message := 'Unable to open file "'+AFileName+'": ' + E.Message;
        //Reraise the same exception but with extra potentially useful information.
        raise;
      end;
    end;