我正在尝试使用Npgsql发送数据表,但是我收到以下错误:
Npgsql或PostgreSQL不支持CLR类型System.Data.DataTable。如果您希望将其映射到PostgreSQL复合类型,则需要在使用前注册它,请参阅文档。
这是代码,P_DETALLE是DATATABLE VARIABLE:
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
答案 0 :(得分:0)
正如错误消息所示,Npgsql不支持将DataTable写入数据库,主要是因为AFAIK PostgreSQL不支持接受表作为函数的参数。
确保您确切了解PostgreSQL函数的样子 - 它接受哪些参数 - 然后转向使用Npgsql调用该函数的任务。