Экранирование многих значений для запроса SQL с использованием C# npgsql - PullRequest
1 голос
/ 06 апреля 2020

Учитывая SQL пример запроса, такой как один ниже и C# npg sql lib / driver, что бы вы посоветовали, как создать окончательный запрос SQL, если вы хотите, чтобы значения были преобразованы в строки (экранированные SQL значений), которые можно использовать при сборке окончательного SQL без страха перед SQL инъекцией.

пример запроса

INSERT INTO table1 (col1, col2, col3) VALUES
 (12, 'aaa', '2020-04-06T12:00Z')
,(13, 'bbb', '2020-04-06T12:01Z')
,(14, 'ccc', '2020-04-06T12:02Z')
-- ... (typically few dozens, max few thousands rows to upsert)
ON CONFLICT ON CONSTRAINT table1_pkey DO UPDATE SET col2 = EXCLUDED.col2, col3 = EXCLUDED.col3;

С запросами не покрывая несколько строк (раздел между VALUES и ON CONFLICT), можно использовать NpgsqlCommandBuilder с именованными параметрами. Но в этом случае количество именованных параметров может быть довольно большим, так как в любом случае исходный шаблон должен быть динамически создан. Поэтому я ищу что-то похожее на псевдо-метод с такой подписью:

string PgsqlEscape<T>(T value);
PgsqlEscape("aaa") == "'aaa'"
PgsqlEscape(DateTimeOffset.UtcNow) == "'2020-04-06T12:01:45.784Z'"
PgsqlEscape(false) == "false"
...