Database 使用Delphi中的现有数据库将交叉引用数据写入文本文件?
我正在尝试将写入文本文件的数据与现有数据库交叉引用(检查写入文本文件的数据是否已存在于数据库中) 我已经创建了将用户登录数据(名称和密码)写入文本文件的程序,然后我开始编写从文本文件读取数据的算法,但我有点卡住了,我将名称存储在文本文件的第一行,将密码(仅字符串值)存储在下一行 我不知道如何检查数据库中是否已经存在此数据,是否需要首先提取数据库的内容?或者你可以直接与数据库交叉引用吗?我已经创建了数据库(UserData.accdb),但还没有将其链接到表单。这就是我到目前为止所做的:Database 使用Delphi中的现有数据库将交叉引用数据写入文本文件?,database,delphi,delphi-7,Database,Delphi,Delphi 7,我正在尝试将写入文本文件的数据与现有数据库交叉引用(检查写入文本文件的数据是否已存在于数据库中) 我已经创建了将用户登录数据(名称和密码)写入文本文件的程序,然后我开始编写从文本文件读取数据的算法,但我有点卡住了,我将名称存储在文本文件的第一行,将密码(仅字符串值)存储在下一行 我不知道如何检查数据库中是否已经存在此数据,是否需要首先提取数据库的内容?或者你可以直接与数据库交叉引用吗?我已经创建了数据库(UserData.accdb),但还没有将其链接到表单。这就是我到目前为止所做的: proc
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将具有更大的可伸缩性
协调文本文件和数据库之间的数据: 有几种不同的方法。你选择的那一个是可以接受的。基本上可以归结为:
条目
条目
条目执行操作
条目执行其他操作
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;