C# Npgsql,支持调用过程吗?
C# Npgsql, Call of procedure supported ?
关于 postgresSQL(版本 11)的新更新。现在支持程序。可以使用 CREATE PROCEDURE 命令创建过程,并使用 CALL 命令执行。
CREATE PROCEDURE MyInsert(_sno text, _eid text, _sd date)
LANGUAGE SQL
AS $$
INSERT INTO app_for_leave(sno, eid, sd)
VALUES(_sno, _eid, _sd);
$$;
CALL MyInsert('4','5','2013-04-04');
现在支持 "CALL" 吗?
目前我只能通过构建一个字符串作为命令然后执行它来使其工作。
例如
using (var conn = new NpgsqlConnection(_connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "CALL MyInsert('4','5','2013-04-04')";
cmd.ExecuteNonQuery();
}
conn.Close();
}
如果有更好的方法在不构建查询字符串的情况下执行 "MyInsert",请告诉我。这很容易受到 sql 注入的影响,因为它不是准备好的语句。
提前致谢!
使用 CALL proc_name() 创建常规命令非常适合执行存储过程 - 没有其他真正需要的东西。这一点都不会或多或少地受到 SQL 注入的影响:您仍然可以通过指定参数占位符(例如 @param1、@param2)照常传递参数。请注意,参数和占位符也与准备好的语句无关 - 使用非准备语句
发送参数(因此可以防止 SQL 注入)是完全有效的
PostgreSQL 协议对调用函数或过程没有任何特殊规定。即使当你使用 CommandType.StoredProcedure
调用函数时,所有这一切都是让 Npgsql 在后台构造一个 SELECT func_name()
并将其作为普通命令发送。
关于 postgresSQL(版本 11)的新更新。现在支持程序。可以使用 CREATE PROCEDURE 命令创建过程,并使用 CALL 命令执行。
CREATE PROCEDURE MyInsert(_sno text, _eid text, _sd date)
LANGUAGE SQL
AS $$
INSERT INTO app_for_leave(sno, eid, sd)
VALUES(_sno, _eid, _sd);
$$;
CALL MyInsert('4','5','2013-04-04');
现在支持 "CALL" 吗?
目前我只能通过构建一个字符串作为命令然后执行它来使其工作。 例如
using (var conn = new NpgsqlConnection(_connectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "CALL MyInsert('4','5','2013-04-04')";
cmd.ExecuteNonQuery();
}
conn.Close();
}
如果有更好的方法在不构建查询字符串的情况下执行 "MyInsert",请告诉我。这很容易受到 sql 注入的影响,因为它不是准备好的语句。
提前致谢!
使用 CALL proc_name() 创建常规命令非常适合执行存储过程 - 没有其他真正需要的东西。这一点都不会或多或少地受到 SQL 注入的影响:您仍然可以通过指定参数占位符(例如 @param1、@param2)照常传递参数。请注意,参数和占位符也与准备好的语句无关 - 使用非准备语句
发送参数(因此可以防止 SQL 注入)是完全有效的PostgreSQL 协议对调用函数或过程没有任何特殊规定。即使当你使用 CommandType.StoredProcedure
调用函数时,所有这一切都是让 Npgsql 在后台构造一个 SELECT func_name()
并将其作为普通命令发送。