首页 > 解决方案 > sqlite3_db_config()的delphi用法

问题描述

我正在尝试将选项设置SQLITE_DBCONFIG_MAINDBNAMEsqlite3_db_config()自定义选项,但在 Delphi 10.3 中这些指针仍然存在问题。连接运行良好,但稍后PRAGMA database_list返回的不是我之前放入函数的内容。第三个参数是我正在试验的,它是变量参数的一部分:

// bind method to sqlite3.dll:
sqlite3_db_config: function (ppDb: Psqlite3; op: Integer): Integer; cdecl varargs;

...

var
  FMainDbName: String;
begin
  FMainDbName := 'chinook';
  // shows "" (empty string)
  FLib.sqlite3_db_config(FHandle, SQLITE_DBCONFIG_MAINDBNAME, PAnsiChar(UTF8Encode(FMainDbName)));
  // shows the first character only: "c"
  FLib.sqlite3_db_config(FHandle, SQLITE_DBCONFIG_MAINDBNAME, PChar(FMainDbName));
end;

SQLite 文档说:

SQLITE_DBCONFIG_MAINDBNAME

此选项用于更改“主”数据库模式的名称。唯一的参数是一个指向常量 UTF8 字符串的指针,它将成为新的模式名称来代替“main”。SQLite 不会复制新的主模式名称字符串,因此应用程序必须确保传递给此 DBCONFIG 选项的参数在数据库连接关闭之前保持不变。

那么,我需要如何格式化第三个参数sqlite3_db_config呢?

标签: sqlitedelphic-api

解决方案


UTF8Encode为其返回值创建一个临时字符串。您必须将该值存储在具有足够长生命周期的变量中:

var
  MainDBNameUTF8: UTF8String;

...
MainDBNameUTF8 := ...;
sqlite3_db_config(FHandle, SQLITE_DBCONFIG_MAINDBNAME, PAnsiChar(MainDBNameUTF8));

推荐阅读