Delphi использование sqlite3_db_config () - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь установить параметр SQLITE_DBCONFIG_MAINDBNAME через sqlite3_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?

1 Ответ

1 голос
/ 26 марта 2020

UTF8Encode создает временную строку для возвращаемого значения. Вы должны сохранить это значение в переменной с достаточно большим временем жизни:

var
  MainDBNameUTF8: UTF8String;

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