Я пытаюсь пройти мимо стола. На стороне базы данных я использую составной тип 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
Что я мог сделать, чтобы отправить стол? Я был бы признателен за вашу помощь





Я нашел следующее, и это сработало, эта ссылка:
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$;
Насколько я знаю, это невозможно, в провайдере не реализован тип для этого. Продолжайте искать, возможно, я ошибаюсь, но вы можете заполнить временную таблицу данными, которые вы бы передали в процедуру, а затем работать с этой временной таблицей аналогичным образом.