Ответ 1
-
Есть; это функция
sqlite3_bind_parameter_index()
, о которой вы говорили, что вы используете, чтобы превратить имя параметра в индекс, который затем можно использовать сsqlite3_bind_*()
. Однако нет функцииsqlite3_bind_*_by_name()
или чего-либо подобного. Это поможет предотвратить раздувание API. В популярной оболочке sqlite базы данных Flying Meat есть поддержка именованных параметров в одном из ее ветвей, если вам интересно посмотреть, как она используется.Если вы думаете о том, что потребуется для реализации полных именованных методов привязки параметров, рассмотрим текущий список функций
bind
:int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); int sqlite3_bind_double(sqlite3_stmt*, int, double); int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); int sqlite3_bind_null(sqlite3_stmt*, int); int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
Если мы хотим добавить явную поддержку именованных параметров, этот список будет удвоен по длине, чтобы включить:
int sqlite3_bind_name_blob(sqlite3_stmt*, const char*, const void*, int n, void(*)(void*)); int sqlite3_bind_name_double(sqlite3_stmt*, const char*, double); int sqlite3_bind_name_int(sqlite3_stmt*, const char*, int); int sqlite3_bind_name_int64(sqlite3_stmt*, const char*, sqlite3_int64); int sqlite3_bind_name_null(sqlite3_stmt*, const char*); int sqlite3_bind_name_text(sqlite3_stmt*, const char*, const char*, int n, void(*)(void*)); int sqlite3_bind_name_text16(sqlite3_stmt*, const char*, const void*, int, void(*)(void*)); int sqlite3_bind_name_value(sqlite3_stmt*, const char*, const sqlite3_value*); int sqlite3_bind_name_zeroblob(sqlite3_stmt*, const char*, int n);
В два раза больше функций означает гораздо больше времени на поддержание API, обеспечение обратной совместимости и т.д. Однако, просто представив
sqlite3_bind_parameter_index()
, они смогли добавить полную поддержку именованных параметров только с одной функцией. Это означает, что если они когда-либо решат поддерживать новые типы привязок (возможно,sqlite3_bind_int128
?), Им нужно добавить только одну функцию, а не две. -
Что касается того, почему никто не использует его... Я не могу дать какой-либо окончательный ответ при проведении опроса. Я предполагаю, что более естественно обращаться к параметрам последовательно, и в этом случае именованные параметры не так полезны. Именованные параметры кажутся полезными, если вам нужно ссылаться на параметры не в порядке.