Как перемещать параметры store procedure PostgreSQL в C#

Я нуждаюсь в том, чтобы переместить параметры в C# для PostgreSQL:

public static IEnumerable<Articulo> SelectListFunc(UniversalExtend filter)
    {
        using (var cn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
        {
            cn.Open();
            using (var cmd = cn.CreateCommand())
            {
                cmd.CommandText = "usp_selectlist";
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@idarticulo", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Id)
                    ? (object)DBNull.Value
                    : $"%{filter.Id}%");
                cmd.Parameters.AddWithValue("@descripcion", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Descripcion)
                    ? (object)DBNull.Value
                    : $"%{filter.Descripcion}%");

                var _articulo = new List<Articulo>();
                using (NpgsqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var a = new Articulo()
                        {
                            IdArticulo = Convert.ToString(reader["idarticulo"]),
                            Descripcion = Convert.ToString(reader["descripcion"])
                        };
                        _articulo.Add(a);
                    }
                }
                return _articulo.ToList();
            }   
        }
    }

Но я получаю следующую ошибку:

Ошибка: Не существует функция usp_selectlist (idarticulo: = character varying, описание: = character varying)

1
задан 12.01.2017, 05:08
0 ответов

Чтобы отвечать на этот вопрос, я буду принимать, что definistes функция usp_selectlist способа, поскольку я рекомендовал это тебе в твоем другом вопросе: Как создание store procedure в PosgreSQL. Это включает настройку относительно движения % внутри функции, вместо того, чтобы это перемещать как параметр.

Или же, используя функцию, определенный, таким образом:

create function usp_selectlist(p_IdArticulo varchar, p_Descripcion varchar)
returns table(IdArticulo varchar,
              Descripcion varchar)
as $$
  select IdArticulo, Descripcion
    from tblarticulos
   where (p_IdArticulo is null or IdArticulo ilike '%' || p_IdArticulo || '%')
     and (p_Descripcion is null or Descripcion ilike '%' || p_Descripcion || '%');
$$ language sql;

Используя CommandType.Text

Первый выбор состоит в том, чтобы выполнять функцию как будто это была консультация нормальный SQL используя CommandType.Text:

cmd.CommandText = "select * from usp_selectlist(@idarticulo, @descripcion)";
cmd.CommandType = CommandType.Text;

cmd.Parameters.AddWithValue(
    "@idarticulo",
    NpgsqlDbType.Varchar,
    string.IsNullOrEmpty(filter.Id)
        ? (object)DBNull.Value
        : filter.Id);

cmd.Parameters.AddWithValue(
    "@descripcion",
    NpgsqlDbType.Varchar,
    string.IsNullOrEmpty(filter.Descripcion)
        ? (object)DBNull.Value
        : filter.Descripcion);

Используя этот выбор, ты не должен заботиться об именах параметров, определенных в функции (p_IdArticulo, p_Descripcion). Ты можешь выбирать имена, которые ты хочешь (@idarticulo, @descripcion). Важное состоит в том, чтобы ты определил правильный тип, переместив параметры (NpgsqlDbType.Varchar).

Adicionalmente, у тебя есть гибкость можения форматировать призыв к функции, возможно добавляя один ORDER BY, или то, что ты хочешь, как будто это была консультация нормальный SQL. Ты не нуждаешься в том, чтобы сделать это, но выбор там.

Используя CommandType.StoredProcedure

Этот выбор похож больше на форму, как работают stored procedures с другими базами данных используя CommandType.StoredProcedure:

cmd.CommandText = "usp_selectlist";
cmd.CommandType = CommandType.StoredProcedure;

// ¡ojo! "parameterName" debe ser igual al parámetro de la función, pero en minúsculas.
cmd.Parameters.AddWithValue(
    "p_idarticulo",
    NpgsqlDbType.Varchar,
    string.IsNullOrEmpty(filter.Id)
        ? (object)DBNull.Value
        : filter.Id);

// ¡ojo! "parameterName" debe ser igual al parámetro de la función, pero en minúsculas.
cmd.Parameters.AddWithValue(
    "p_descripcion",
    NpgsqlDbType.Varchar,
    string.IsNullOrEmpty(filter.Descripcion)
        ? (object)DBNull.Value
        : filter.Descripcion);

Противоречащий предыдущему выбору, здесь ты должен быть осторожен определения имен параметров так что они были идентичны именам параметров в определении функции. Более того, если параметры в функции были определены смесью прописных букв и строчных букв, как hize я в моем примере (p_IdArticulo, p_Descripcion), тогда дебет использовать эквивалентные имена, но используя только мелкие (p_idarticulo, p_descripcion).

Если ты не определяешь хорошо имена параметров, тогда ты получаешь ошибку:

Не существует функция usp_selectlist (idarticulo: = character varying, описание: = character varying)

2
ответ дан 03.12.2019, 17:44