小编Ale*_*der的帖子

使用 id 和 string 进行搜索的变量类型

我需要在内存中存储大约 500-1000 个条目的 3 个字段,并通过 int 和 str 值进行快速有效的搜索。搜索发生在大约 300-500 个请求的快速突发中。我不确定如何有效地做到这一点。

存储的数据由 3 个字段组成:

  1. ID - 整数,不会是连续的。即它会像 (3, 5, 12, 55),但不是 (1, 2, 3, 4, 5)。
  2. 名称 - 字符串。
  3. 标签 - 字符串。

有3种可能的情况:

  1. 按名称获取 ID。
  2. 通过 ID 获取名称。
  3. 通过 ID 获取标签。

目前,我使用两种不同的类型:

  1. 带有密钥对“%s=%i”的 THashedStringList 按名称搜索。
  2. 其他搜索按 ID 排序的记录数组。

我发现这非常低效,目前正在寻找新的想法。任何提示?

delphi delphi-10-seattle

5
推荐指数
2
解决办法
190
查看次数

有没有办法使用 FireDAC 插入 Null 值作为参数?

当我将值插入表中时,我想将一些字段留空(即 Null)。我不明白为什么我想要一个字段中充满空字符串的数据库。

我使用 Delphi 10、FireDAC 和本地 SQLite DB。

编辑:提供的代码只是一个示例。在我的应用程序中,值由用户输入和函数提供,其中许多都是可选的。如果 value 为空,我想将其保留为 Null 或默认值。创建 ExecSQL 的多个变体和嵌套 If 语句也不是一个选项 - 可选字段太多(准确地说是 18 个)。

测试表:

CREATE TABLE "Clients" (
    "Name"  TEXT,
    "Notes" TEXT
);
Run Code Online (Sandbox Code Playgroud)

这就是我尝试的方法:

var someName,someNote: string;
begin
{...}
someName:='Vasya';
someNote:='';
FDConnection1.ExecSQL('INSERT OR REPLACE INTO Clients(Name,Notes) VALUES (:nameval,:notesval)',
    [someName, IfThen(someNote.isEmpty, Null, somenote)]);
Run Code Online (Sandbox Code Playgroud)

这引发了一个例外:

could not convert variant of type (Null) into type (OleStr)
Run Code Online (Sandbox Code Playgroud)

我尝试重载它并指定 [ftString,ftString] 但没有帮助。

目前我必须这样做,我讨厌这个凌乱的代码:

FDConnection1.ExecSQL('INSERT OR REPLACE INTO Clients(Name,Notes) VALUES ('+
    IfThen(someName.isEmpty,'NULL','"'+Sanitize(someName)+'"')+','+
    IfThen(someNote.isEmpty,'NULL','"'+Sanitize(someNote)+'"')+');');
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Edit2:目前我看到一个使用“INSERT OR REPLACE”创建新行的选项,然后对每个非空值在一行中使用多个 UPDATE。但这看起来非常无效。像这样:

FDConnection1.ExecSQL('INSERT …
Run Code Online (Sandbox Code Playgroud)

delphi sqlite firedac

2
推荐指数
1
解决办法
1981
查看次数

标签 统计

delphi ×2

delphi-10-seattle ×1

firedac ×1

sqlite ×1