我可能错了,但我认为它无法实现,原因与无法将表名作为查询参数传递的原因相同。
但是,您可以使用字符串替换它:
string name = "test";
var tc = new NpgsqlCommand($"ALTER TYPE attributeName ADD VALUE IF NOT EXISTS '{name}'", conn);
请记住,这不是一种安全的方法!
更新:
另一种解决方案是使用执行命令的存储过程。但是,您不能简单地在过程/函数中调用ALTER TYPE ... ADD VALUE ... 命令,因为它在事务块中不起作用。你会得到以下错误:
"ALTER TYPE ... ADD 不能从函数执行或
多命令字符串"
这个帖子应该对这个问题有所了解:Problems with ENUM type manipulation in 9.1
但是,您的问题可能有解决方案。看起来您正在尝试修改现有的枚举类型(添加一个新值)。您可以创建一个直接对pg_enum 表进行操作的函数。专为枚举类型操作而设计的数据库函数集可在此处找到:PostgreSQL 8.3+, 9.1+ ALTER ENUM emulation: element addition/removal, transactions。
向现有枚举添加新值的函数如下所示:
-- Also works within transactions in PostgreSQL 9.1+ (but you need
-- to reconnect to the database after transaction commit, because
-- new enum items are not be visible within the session you used
-- to add them).
--
-- See http://en.dklab.ru/lib/dklab_postgresql_enum/
--
-- (C) Dmitry Koterov, 2013
-- This code is BSD licensed.
--
CREATE SCHEMA enum AUTHORIZATION postgres;
SET search_path = enum, pg_catalog;
SET check_function_bodies = false;
CREATE OR REPLACE FUNCTION enum.enum_add (
enum_name varchar,
enum_elem varchar
)
RETURNS void AS
$body$
DECLARE
eoid OID;
has_sortorder BOOLEAN;
BEGIN
eoid := (
SELECT pg_type.oid
FROM pg_type JOIN pg_namespace ON pg_namespace.oid=pg_type.typnamespace
WHERE typtype='e' AND enum_name IN(typname, nspname||'.'||typname)
);
has_sortorder := EXISTS(
select 1
from pg_attribute
where attrelid=(select oid from pg_class where relname='pg_enum') and attname='enumsortorder'
);
IF has_sortorder THEN
EXECUTE '
INSERT INTO pg_enum(enumtypid, enumlabel, enumsortorder) VALUES(
'||eoid||',
'||quote_literal(enum_elem)||',
(SELECT MAX(enumsortorder) + 1 FROM pg_enum WHERE enumtypid='||eoid||')
)
';
ELSE
EXECUTE E'INSERT INTO pg_enum(enumtypid, enumlabel) VALUES('||eoid||', '||quote_literal(enum_elem)||')';
END IF;
END;
$body$
LANGUAGE 'plpgsql';
COMMENT ON FUNCTION enum.enum_add (enum_name character varying, enum_elem character varying) IS 'Inserts a new ENUM element wthout re-creating the whole type.';
现在,您可以从 C# 代码中调用存储过程/函数:
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = @"enum.enum_add";
cmd.Parameters.AddWithValue("enum_name", "attributeName");
cmd.Parameters.AddWithValue("enum_elem", "O'Reilly");
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
请注意,如果您尝试添加现有值,上述功能将失败。