Vb.net Npgsql错误数据表

Vb.net Npgsql错误数据表,vb.net,postgresql,npgsql,Vb.net,Postgresql,Npgsql,我正在尝试使用Npgsql发送数据表,但出现以下错误: Npgsql或PostgreSQL不支持CLR类型System.Data.DataTable。如果您希望将其映射到PostgreSQL复合类型,则需要在使用前进行注册,请参阅文档 这是代码,p_DETALLE是DATATABLE变量: Sub ADMINISTRAR_ARTEFACTO(ByVal P As E_ARTEFACTO) Dim CONECTION As New NpgsqlConnection Try

我正在尝试使用Npgsql发送数据表,但出现以下错误:

Npgsql或PostgreSQL不支持CLR类型System.Data.DataTable。如果您希望将其映射到PostgreSQL复合类型,则需要在使用前进行注册,请参阅文档

这是代码,p_DETALLE是DATATABLE变量:

Sub ADMINISTRAR_ARTEFACTO(ByVal P As E_ARTEFACTO)
    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", P.P_DETALLE)
            .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
这是postgresql函数:

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 
ROWS 0
AS $BODY$

DECLARE 

    VL_ID_ARTEFACTO INTEGER;
    VL_ID_DETALLE_AC 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());

        SELECT COALESCE(MAX(ID_DETALLE_AC),0) INTO VL_ID_DETALLE_AC FROM DETALLE_AC;
        VL_ID_DETALLE_AC:=VL_ID_DETALLE_AC+1;

        INSERT INTO DETALLE_AC(ID_DETALLE_AC,ID_ARTEFACTO,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,
                               USUARIO_CREACION,FECHA_CREACION)
        SELECT VL_ID_DETALLE_AC,VL_ID_ARTEFACTO,ID_COMPONENTE,PRECIO,CANTIDAD,SUB_TOTAL,v_usuario,NOW()
        FROM (SELECT V_DETALLE.*) AS V_DETALLE;
        --VALUES (VL_ID_DETALLE_AC,VL_ID_ARTEFACTO,V_DETALLE.ID_COMPONENTE,V_DETALLE.PRECIO,V_DETALLE.CANTIDAD,V_DETALLE.SUB_TOTAL,v_usuario,NOW());


    END IF;

END;


$BODY$;
这是一种:

CREATE TYPE public.type_detalle_ac AS
(
id_componente integer,
precio numeric(10,2),
cantidad integer,
sub_total numeric(10,2)
);
我被V_DETALLE修改了

.
.
.
.Parameters.Add("V_DETALLE", NpgsqlDbType.Array / NpgsqlDbType.Composite).Value = {1, "COMPONENTE A", 10, 3, 30}
.
.
但是下面的错误出现了

Npgsql中尚不支持此NpgsqlDbType:-44739243


正如错误消息所说,Npgsql不支持将DataTable写入数据库,主要是因为AFAIK PostgreSQL不支持接受表作为函数的参数


请确保您完全理解PostgreSQL函数的外观(它接受哪些参数),然后转向使用Npgsql调用该函数的任务。

我认为错误消息是清楚的。除了存储过程之外,还有什么类型?有什么解决方案吗?等待我创建的类型,就像他们在3.1.7中添加了此功能一样检查这里:嗨,Juan Carlos,我使用Npgsql-3.2.7版本Hello Shay Rojansky,我在问题中添加了函数和类型,,,我能做些什么来调用该函数?@nasck as Shay说DataTable不是受支持的类型。那么如何发送一个表呢?你所要求的没有意义。。。您的函数接受类型为
type\u detalle\u ac
的参数
v_detalle
,该参数是单个“行”。DataTable是这些行的表,而不是一行。换句话说,您的函数实际上不接受行(也不以简单的方式支持它)。