Как получить данные из базы данных с помощью хранимой процедуры? - PullRequest
1 голос
/ 12 февраля 2020

Мне нужно получить данные из базы данных с помощью хранимой процедуры и затем показать их в отчете.

У меня есть этот код:

conexion.Open();

NpgsqlCommand cm = new NpgsqlCommand("sp_reporte", conexion);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@codigo", int.Parse(codigof.Text));

NpgsqlDataAdapter da = new NpgsqlDataAdapter(cm);

DataSet ds = new DataSet();
da.Fill(ds);

, но этот код не работать, потому что это не приносит мне никаких данных

Вот так у меня есть хранимая процедура

CREATE OR REPLACE FUNCTION sp_reporte(codigo integer) 
RETURNS refcursor AS $$
DECLARE
  ref refcursor;                                                    
BEGIN
  OPEN ref FOR SELECT *
                FROM factura f
                INNER JOIN detallefactura d ON f.codigofactura = d.codigofactura
                WHERE f.codigo = codigo;  
  RETURN ref;                                                      
END;
$$ LANGUAGE plpgsql;

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Пожалуйста, смотрите ответ Шея Рожанского здесь . Что вам нужно сделать, это изменить ваш FUNCTION, чтобы вернуть TABLE или SETOF. Между прочим, существуют различия в postgreSQL между процедурами и функциями, хотя здесь они не особенно актуальны: если быть точным, то вы используете функцию, а не процедуру. Одним из преимуществ этого подхода является то, что вам придется указывать возвращаемые поля и типы, то есть вы не сможете сделать SELECT *. Хотя это больше работы на вашей стороне, это хорошая вещь, поскольку она делает ваш код намного безопаснее в долгосрочной перспективе. Если вам нужна помощь с синтаксисом для возвращаемого типа, пожалуйста, дайте мне знать.

0 голосов
/ 12 февраля 2020

Это то, что я использую с SqlConnection,

using (var connection = new SqlConnection()) {
    connection.ConnectionString = YourConnectingString;

    using (var command = new SqlCommand(procedure, connection)) {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@codigo", SqlDbType.Int).Value = int.Parse(codigof.Text);

        connection.Open();
        command.ExecuteNonQuery();
        using (var da = new SqlDataAdapter(command)) {
            da.Fill(_dt);
        }
    }
}

Как я уже говорил в разделе комментариев выше, я не знаком с PostgreSQL, поэтому я не могу точно сказать, является ли ваша хранимая процедура правильно ...

Я думаю, что ваша хранимая процедура должна объявить переменную @ codi go, как вы сделали для refcursor. И в коде

WHERE f.codigo = @codigo; 
...