В приведенных выше результатах, похоже, много путаницы.
Npgsql не выполняет экранирование параметров, поскольку они отправляются вне диапазона и не обрабатываются в SQL. Если значение вашего параметра содержит строку C # с двумя апострофами, это то, что будет вставлено в базу данных.
После запуска кода выше и использования psql я получаю следующее:
var cmd = new NpgsqlCommand("INSERT into foo (name) VALUES (@value)", conn);
cmd.Parameters.AddWithValue("@value", "''");
cmd.ExecuteNonQuery();
npgsql_tests=# select * from foo;
name
------
''
(1 row)
Возможно, pgadmin показывает значения с обратной косой чертой - я не знаю - но это будет проблемой с отображением.
Наконец, если вы действительно хотите вставить постоянное значение (в отличие от предоставленного пользователем), нет никаких причин использовать параметры. Просто вставьте ваше значение в SQL:
INSERT INTO foo (name) VALUES ('''''');
Там есть шесть апострофов: 2 в качестве разделителей строк и еще два экранированных апострофа (в SQL '' - экранированная форма единственного буквального апострофа).
Однако, если вы читаете ввод от пользователя, обязательно используйте параметр.