我正试图通过sqlite3_db_config()
将SQLITE_DBCONFIG_MAINDBNAME
选项设置为自定义选项,但在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
的第三个参数?
UTF8Encode
为其返回值创建临时字符串。您必须将该值存储在一个寿命足够长的变量中:
var
MainDBNameUTF8: UTF8String;
...
MainDBNameUTF8 := ...;
sqlite3_db_config(FHandle, SQLITE_DBCONFIG_MAINDBNAME, PAnsiChar(MainDBNameUTF8));