使用C#npgsql为SQL查询转义多个值

使用C#npgsql为SQL查询转义多个值,c#,npgsql,C#,Npgsql,给定SQL查询示例,如下面的一个和C#npgsql 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'

给定SQL查询示例,如下面的一个和C#npgsql 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;
对于包含多行的查询not(值与冲突之间的部分),可以使用带有命名参数的NpgsqlCommandBuilder。但在这种情况下,命名参数的数量可能相当高,而且原始模板无论如何都必须动态创建。 因此,我正在寻找类似于伪方法的东西,具有以下特征:

string PgsqlEscape<T>(T value);

可以执行单独的insert语句,也可以使用循环动态添加其他参数以连接和构建SQL字符串(这是安全的,因为用户不会输入),同时将参数添加到命令生成器中。可以对每个参数进行编号,使其与SQL语句中相应的占位符对齐。“如果希望将值转换为字符串(转义SQL值),可以在组装最终SQL时使用,而不必担心SQL注入,那么您建议如何构造最终SQL查询。”-我不会;我会使用参数——要么一次一行,要么成批(最多不超过最大参数计数的行数);尝试转义输入只会给SQLiEither do separate insert语句带来麻烦,或者使用循环动态添加其他参数以连接和构建SQL字符串(这是安全的,因为用户不会输入),同时将参数添加到命令生成器中。可以对每个参数进行编号,使其与SQL语句中相应的占位符对齐。“如果希望将值转换为字符串(转义SQL值),可以在组装最终SQL时使用,而不必担心SQL注入,那么您建议如何构造最终SQL查询。”-我不会;我会使用参数——要么一次一行,要么成批(最多不超过最大参数计数的行数);试图逃避输入只会给SQLi带来麻烦
PgsqlEscape("aaa") == "'aaa'"
PgsqlEscape(DateTimeOffset.UtcNow) == "'2020-04-06T12:01:45.784Z'"
PgsqlEscape(false) == "false"