Есть ли какой-либо C SQLite API для заключения в кавычки/выхода названия таблицы?

Невозможно sqlite3_bind_text имя таблицы, потому что sqlite3_prepare_v2 сбои для подготовки оператора, такого как:

SELECT * FROM ? ;

Я предполагаю, что имя таблицы необходимо для парсинга оператора, таким образом, заключение в кавычки должно произойти прежде sqlite3_prepare_v2.

Есть ли что-то как a sqlite3_quote_tablename? Возможно, это уже существует под именем, которое я не могу распознать, но я ничего не могу найти в списке функций.

8
задан Brian Tompsett - 汤莱恩 13 February 2017 в 16:45
поделиться

3 ответа

При использовании подготовленных операторов SQLite с параметрами параметр: "указывает местозаполнитель в выражении для буквального значения, которое заполняется во время выполнения "

Перед выполнением любого оператора SQL SQLite «компилирует» строку SQL в серию кодов операций , которые выполняются внутренней виртуальной машиной. Имена таблиц и столбцов, с которыми работает оператор SQL, являются необходимой частью процесса компиляции.

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

SELECT * FROM FOO WHERE name=?;

А затем вызвать sqlite3_bind_text () для привязки строки gavinbeatty к уже составленному заявлению. Однако эта архитектура означает, что вы не можете использовать такие параметры:

SELECT * FROM ? WHERE name=?;    // Can't bind table name as a parameter
SELECT * FROM FOO WHERE ?=10;    // Can't bind column name as a parameter
1
ответ дан 6 December 2019 в 00:06
поделиться

Если имя таблицы содержит недопустимые символы, вы можете заключить имя таблицы в двойные кавычки, как здесь.

sqlite> create table "test table" (id);
sqlite> insert into "test table" values (1);
sqlite> select * from "test table";
id
----------
1

Конечно, вам следует по возможности избегать использования недопустимых символов. Это усложняет разработку и почти всегда не требуется (IMO, единственный раз, когда это необходимо, - это когда вы наследуете проект, который уже выполнен таким образом, и он слишком велик, чтобы его можно было изменить).

2
ответ дан 6 December 2019 в 00:06
поделиться

Подход, который, как я видел, используется для обнаружения ошибок в UncoughtExcpingHandler , заключается в том, чтобы записать данные сбоя в файл, а затем запустить обработку ошибок Activity при перезапуске приложения на основе существования файла данных сбоя.

В зависимости от того, что вы хотите сделать Операция , это может работать для вас.

-121--4321002-

Используйте его дважды, например \\

-121--2501883-

Если SQLite не принимает имена таблиц в качестве параметров, я не думаю, что есть решение вашей проблемы...

Учтите, что

Параметры, которым не присвоены значения с помощью sqlite3_bind (), рассматриваются как NULL.

поэтому в случае запроса имя таблицы будет иметь значение NULL, что, конечно, является недопустимым.

0
ответ дан 6 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: