.net Core Npgsql.PostgresException 42710: повторяющееся имя соединения - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть функция PostgreSQL, где происходит вставка или обновление и сохранение журналов через dblink.В моем проекте на .net Core я пытался вызвать функцию, как показано ниже, и я получаю PostgresException 42710: duplicate connection name, но если я удаляю строки using (NpgsqlTransaction tran = conn.BeginTransaction()) и tran.Commit();, все работает хорошо

У меня вопрос, почемуэто работает, или, может быть, я что-то не понимаю?

internal static void Client_Save(int id_user, Client client) {    
  using (NpgsqlConnection conn = new NpgsqlConnection(Globals.pcs)) {
    conn.Open();
    using (NpgsqlTransaction tran = conn.BeginTransaction())
    using (NpgsqlCommand cmd = new NpgsqlCommand("Client_Save", conn)) {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.AddWithValue("id_moderator", NpgsqlTypes.NpgsqlDbType.Integer, id_user);
      cmd.Parameters.AddWithValue("id_client", NpgsqlTypes.NpgsqlDbType.Integer, client.Id_Client);
      cmd.Parameters.AddWithValue("clientname", NpgsqlTypes.NpgsqlDbType.Varchar, client.Name);

      object res = cmd.ExecuteScalar();
      tran.Commit();

      conn.Close();
    }
  }

  return response;
}

Моя функция PostgreSQL ниже

create or replace function User_Save (ID_Moderator integer, ID_User integer, Username varchar(32), Fullname varchar(256), ID_Role integer, Pass varchar(32)) 
returns integer
as $$
declare
  var_ID_User integer := ID_User;
  var_Action varchar(64) := '';
  var_Log varchar(4000) := '';
  var_Return integer := 0;
begin 
  if (var_ID_User > 0) then
    update "User" set
      "Username" = Username,
      "Fullname" = Fullname,
      "Role" = ID_Role
    where "id" = var_ID_User; 

    select 
      case when u."Fullname" <> Fullname then 'Fullname: ' || u."Fullname" || ' > ' || Fullname || '. ' else '' end ||
      case when u."Username" <> Username then 'Username: ' || u."Username"  || ' > ' || Username || '. 'else '' end,
      'Update'
    into var_Log, var_Action
    from "User" as u
    where u."id" = var_ID_User;
  else
    insert into "User" (
      "Username", 
      "Fullname", 
      "Role", 
      "PassHash"
    ) values (
      Username,
      Fullname,
      ID_Role,
      hash_int(Pass)
    ) returning "id" into var_ID_User; 

    var_Action := 'Create';
    var_Log := 'Fullname: ' || Fullname || ', Username: ' || Username;
  end if;

  perform Log_Save(ID_Moderator, 'User', var_ID_User, var_Action, var_Log);

  return var_Return;
end; $$ 
language 'plpgsql';

И моя функция для сохранения журнала

create or replace function Log_Save (Moderator integer, Subject varchar(32), ID_Subject integer, LogAction varchar(64), LogText varchar(4000)) 
returns void as $$
begin
    perform dblink_connect('log_save', 'dbname=myDbName');
    perform dblink_exec('log_save', 'insert into "Log" ("Moderator", "Subject", "ID_Subject", "Text", "Action", "LogDate") values (' || 
                        Moderator || ', ''' || 
                        Subject || ''',' || 
                        ID_Subject || ',''' || 
                        LogText || ''', ''' || 
                        LogAction || ''', ''' || 
                        now() || ''');');
    perform dblink_exec('log_save', 'commit;');
    perform dblink_disconnect('log_save');
end; $$ 
language plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...