Npgsql - как передать таблицу?

Я пытаюсь пройти мимо стола. На стороне базы данных я использую составной тип type_detalle_ac, а на стороне vb я пытаюсь отправить список с помощью MapCompositeGlobally, это будет код в vb:

Sub ADMINISTRAR_ARTEFACTO(ByVal P As E_ARTEFACTO, ByVal LD As List(Of E_DETALLE_AC))
NpgsqlConnection.MapCompositeGlobally(Of List(Of E_DETALLE_AC))("type_detalle_ac")
Dim CONECTION As New NpgsqlConnection


Try
    CONECTION.ConnectionString = "Host=localhost;Username=postgres;Password=123;Database=ALURHE_DB"
    Dim COMMAND As New NpgsqlCommand
    With COMMAND
        .Connection = CONECTION
        .CommandType = CommandType.StoredProcedure
        .CommandText = "SP_ADM_ARTEFACTO"

        .Parameters.AddWithValue("v_serie", P.P_SERIE)
        .Parameters.AddWithValue("v_tipo_artefacto", P.P_TIPO_ARTEFACTO)
        .Parameters.AddWithValue("v_modelo", P.P_MODELO)
        .Parameters.AddWithValue("v_marca", P.P_MARCA)

        .Parameters.AddWithValue("v_detalle", LD)
        .Parameters.AddWithValue("v_usuario", P.P_USUARIO)
        .Parameters.AddWithValue("v_id_artefacto", If(P.P_TIPO_OPERACION = "M", P.P_ID_ARTEFACTO, DBNull.Value))
        .Parameters.AddWithValue("v_tipo_operacion", P.P_TIPO_OPERACION)

        End With


    CONECTION.Open()

    COMMAND.ExecuteNonQuery()
    CONECTION.Close()

Catch ex As Exception
    If (CONECTION.State = ConnectionState.Open) Then
        CONECTION.Close()
    End If

    Throw ex
End Try
End Sub

это код класса:

Public Class E_DETALLE_AC
   Public Property id_componente As Integer

   Public Property precio As Decimal
   Public Property cantidad As Integer
   Public Property sub_total As Decimal
End Class

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

PostgreSQL composite type public.type_detalle_ac contains field id_componente which could not match any on CLR type List`1

Что я мог сделать, чтобы отправить стол? Я был бы признателен за вашу помощь

Насколько я знаю, это невозможно, в провайдере не реализован тип для этого. Продолжайте искать, возможно, я ошибаюсь, но вы можете заполнить временную таблицу данными, которые вы бы передали в процедуру, а затем работать с этой временной таблицей аналогичным образом.

Crowcoder 14.03.2018 18:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
103
1

Ответы 1

Я нашел следующее, и это сработало, эта ссылка:

https://gist.github.com/jakejscott/eee8a257fceabbec537c92a8604a516e

В части MapCompositeGlobally мне пришлось поместить только класс, а не список. Список просто поместил бы его в параметр "v_detalle".

Sub ADMINISTRAR_ARTEFACTO(ByVal P As E_ARTEFACTO, ByVal LD As List(Of E_DETALLE_AC))
    NpgsqlConnection.MapCompositeGlobally(Of E_DETALLE_AC)("type_detalle_ac")
    Dim CONECTION As New NpgsqlConnection


    Try
        CONECTION.ConnectionString = "Host=localhost;Username=postgres;Password=123;Database=ALURHE_DB"
        Dim COMMAND As New NpgsqlCommand
        With COMMAND
            .Connection = CONECTION
            .CommandType = CommandType.StoredProcedure
            .CommandText = "sp_adm_artefacto"

            .Parameters.AddWithValue("v_serie", P.P_SERIE)
            .Parameters.AddWithValue("v_tipo_artefacto", P.P_TIPO_ARTEFACTO)
            .Parameters.AddWithValue("v_modelo", P.P_MODELO)
            .Parameters.AddWithValue("v_marca", P.P_MARCA)

            .Parameters.AddWithValue("v_detalle", LD)
            .Parameters.AddWithValue("v_usuario", P.P_USUARIO)
            .Parameters.AddWithValue("v_id_artefacto", If(P.P_TIPO_OPERACION = "M", P.P_ID_ARTEFACTO, DBNull.Value))
            .Parameters.AddWithValue("v_tipo_operacion", P.P_TIPO_OPERACION)
        End With


        CONECTION.Open()

        COMMAND.ExecuteNonQuery()
        CONECTION.Close()

    Catch ex As Exception
        If (CONECTION.State = ConnectionState.Open) Then
            CONECTION.Close()
        End If

        Throw ex
    End Try
End Sub

На стороне базы данных объявите v_detalle типа type_detalle_ac, но в качестве массива я также использую unnest в select

CREATE OR REPLACE FUNCTION public.sp_adm_artefacto(
v_serie character varying DEFAULT NULL::character varying,
v_tipo_artefacto integer DEFAULT NULL::integer,
v_modelo character varying DEFAULT NULL::character varying,
v_marca integer DEFAULT NULL::integer,
v_detalle type_detalle_ac[] DEFAULT NULL::type_detalle_ac[],
v_usuario integer DEFAULT NULL::integer,
v_id_artefacto integer DEFAULT NULL::integer,
v_tipo_operacion character DEFAULT NULL::bpchar)
RETURNS void
LANGUAGE 'plpgsql'

COST 100
VOLATILE 

AS $BODY$

DECLARE 

    VL_ID_ARTEFACTO INTEGER;

BEGIN
    IF V_TIPO_OPERACION = 'I' THEN

        SELECT COALESCE(MAX(ID_ARTEFACTO),0) INTO VL_ID_ARTEFACTO FROM ARTEFACTO;
        VL_ID_ARTEFACTO:=VL_ID_ARTEFACTO+1;

        INSERT INTO ARTEFACTO (ID_ARTEFACTO,SERIE,TIPO_ARTEFACTO,MODELO,MARCA,USUARIO_CREACION,FECHA_CREACION)
        VALUES (VL_ID_ARTEFACTO,v_serie,v_tipo_artefacto,v_modelo,v_marca,V_USUARIO,NOW());

        INSERT INTO DETALLE_AC(ID_ARTEFACTO,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,
                               USUARIO_CREACION,FECHA_CREACION)
        SELECT VL_ID_ARTEFACTO,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,v_usuario,NOW()
        FROM unnest(V_DETALLE);

    END IF;

END;


$BODY$;

Другие вопросы по теме