Ошибка при выполнении запроса postgres с npgsql dll v3.1.9

Я пытаюсь выполнить свою функцию Postgres из C# web api. Каким-то образом при его выполнении Postgres выдает синтаксическую ошибку. Но при использовании с ключевым словом ‘Select’ он не дает никакой ошибки. Я использовал подобный метод много раз со старой библиотекой Npgsql, но никогда не получал никакой ошибки. Теперь используется последний Npgsql 3.1.9 первый раз. Может ли кто-нибудь помочь мне в этом?

используемый код:

    try
    {
    using (NpgsqlConnection con = new NpgsqlConnection(connectionString))
    {
        con.Open();
        string query = "user_signup(" + _cmpid + "::integer,'" + _email + "','" + _contact + "')";
        using (NpgsqlTransaction tran = con.BeginTransaction())
        {
            using (NpgsqlCommand cmd = new NpgsqlCommand(query, con))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                NpgsqlDataReader reader = cmd.ExecuteReader();            
                if (reader.Read())
                {
                    if (!reader.IsDBNull(0))
                        Id = reader.GetValue(0).ToString();
                    RStatus = "OK";
                }
                reader.Close();
            }
            tran.Dispose();
        }
        con.Close();
    }
}
catch(Exception ex){}

Запрос call-user_signup(1:: integer,’xyz@outlook.com’, ‘8965472335’)

Произошло исключение-42601: синтаксическая ошибка at или near «(«

трассировка стека —

at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
   at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode)
   at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
   at Npgsql.NpgsqlConnector.ReadExpecting[T]()
   at Npgsql.NpgsqlDataReader.NextResultInternal()
   at Npgsql.NpgsqlDataReader.NextResult()
   at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
   at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
   at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at Npgsql.NpgsqlCommand.ExecuteReader()
   at BusToWorkAPI.DBOperations.DbHandler.SignUpUser(Int32 _cmpid, String _email, String _contact) in d:DbHandler.cs:line 673

1 ответ

  1. Начиная с версии 3.0 Npgsql ожидает только имя функции CommandTextпри выполнении с CommandType.StoredProcedure. Вы должны добавить NpgsqlParameters к вашей команде с правильными значениями (по крайней мере, это предотвратит потенциальную инъекцию SQL в текущем коде).

    Это описано в примечаниях по миграции .