我正在使用Delphi 7中编写的程序(遗憾的是我不能使用此程序的新版本)来考虑个人。对于每个人,我需要加载一堆值(最多0到90,具有取决于人的确切数字;非固定的),稍后在代码中使用。在尝试了很多东西之后,包括通过Excel加载(速度非常慢),有人建议通过Access加载数据。到目前为止,我设法得到以下代码:
MainConnection : TADOConnection;
Table : TADOTable;
StrConnection : String;
//I first open a connection to load the values in from
MainConnection:=TADOConnection.Create(nil);
StrConnection:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb;Mode=Read;Persist Security Info=False;';
MainConnection.LoginPrompt:=False;
MainConnection.ConnectionString:= StrConnection;
MainConnection.Connected:=True;
Table:=TADOTable.Create(nil);
Table.Connection :=MainConnection;
Table.TableName := 'Sheet1';
Table.Open;
// I get the first three values which I absolutely require
Firstvalue := Table.Fields[0].value;
Secondvalue := Table.Fields[1].value;
Thirdvalue := Table.Fields[2].value;
//Whether I need additional values depends on the first and second values; if the first is a specific value
// I do not need any of the other ones
nrofvaluestoget := round((Secondvalue-Firstvalue));
if (Firstvalue = 100) then nrofvaluestoget:= 0;
if (nrofvaluestoget>0) then begin
for k := 0 to (nrofvaluestoget) do begin
Valueholder[k] := Table.Fields[5+k].value; ; // values for the valueholder
Table.Next; //Go to next person
这链接了访问数据库,从技术上来说就是我想要的。然而,虽然它比在excel文件中加载更快,但由于“nrofvaluestoget”循环,它仍然很慢。跳过那个并立即加载一个人的所有值会加快这个过程。
据我所知,这可能是使用SQL查询;类似于:'SELECT * FROM Sheet1'。但是,我不熟悉SQL,更不用说通过Delphi 7链接它了。是否有可能立即获取所有值并立即将它们分配给Delphi 7的“Valueholder”?或者至少,是否有某种方法可以加快上面我不知道的代码?任何帮助将不胜感激。
编辑:
Per Juan的建议我添加了一些关于数据库的其他描述。
我发布了一张图片作为数据库的示例,因为我无法嵌入或创建一个像样的表。
假设我有三个人。人1将有15岁作为第一年龄,16岁作为第二年龄。 在当前循环中,Valueholder将在索引0处具有值2,在索引1处具有值0. Person 1没有具有值的其他年龄,因此在循环中不考虑这些。
评估下一个人时,所有Valueholder的指数都设置为基值(空白)。
第2个人有18个为第一个年龄,20个为第二个年龄。然后,Valueholder获得3个值,即:索引0处的值8,索引1处的值4以及索引2处的值2.
对于最后一个人,Valueholder的所有指数再次重置为其基值。
第3人有100岁为第一年龄;这表明此人没有需要加载的值,因此Valueholder为空
我希望这会澄清一下这个问题。
答案 0 :(得分:-1)
(如果这是一次性导入) 我建议将数据导出到csv文件,并使用TFileStream在Delphi程序中读取它。这比连接到Access或SQL服务器或任何数据库要快。