我正在尝试通过具有表值参数的存储过程更新/插入数据。
这里是classA:
public class classA
{
public DateTime Param1 { get; set; }
public string Param2 { get; set; }
public string Param3 { get; set; }
public int Param4 { get; set; }
public int Param5 { get; set; }
public decimal Param6 { get; set; }
public int Param7 { get; set; }
public string Param8 { get; set; }
public bool Param9 { get; set; }
public bool Param10 { get; set; }
public bool Param11 { get; set; }
public string Param12 { get; set; }
public string Param13 { get; set; }
public string Param14 { get; set; }
public string Param15 { get; set; }
public string Param16 { get; set; }
public string Param17 { get; set; }
public int Param18 { get; set; }
public int Param19 { get; set; }
public int Param20 { get; set; }
public int Param21 { get; set; }
public int Param22 { get; set; }
public string Param23 { get; set; }
public string Param24 { get; set; }
public string Param25 { get; set; }
public string Param26 { get; set; }
public string Param27 { get; set; }
public string Param28 { get; set; }
public string Param29 { get; set; }
public string Param30 { get; set; }
public string Param31 { get; set; }
public string Param32 { get; set; }
public string Param33 { get; set; }
public string Param34 { get; set; }
}
字符串
下面是我用来调用存储过程的代码:
public static void ExecuteStoredProcedureWithSingleTableTypeParameter<T>(string connectionString, string storedProcedureName, List<T> parameters)
{
using (var connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (var command = new NpgsqlCommand(storedProcedureName, connection))
{
command.CommandType = CommandType.StoredProcedure;
// Assuming "p_data" is the parameter name in your stored procedure
var parameter = new NpgsqlParameter
{
ParameterName = "p_data",
NpgsqlDbType = NpgsqlDbType.Jsonb,
Direction = ParameterDirection.Input,
Value = JsonConvert.SerializeObject(parameters, new JsonSerializerSettings
{
ContractResolver = new LowercaseContractResolver(),
Formatting = Formatting.None // You can adjust formatting as needed
})
};
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
}
}
}
型
这就是存储过程:
CREATE OR REPLACE PROCEDURE Test.SP1(
p_data Test.TableType1
)
LANGUAGE plpgsql
AS $$
BEGIN
--STATEMENTS
END;
$$;
型
我从不同的类调用ExecuteStoredProcedureWithSingleTableTypeParameter
方法,如下所示:
DBRepository.ExecuteStoredProcedureWithSingleTableTypeParameter(connectionString, "test.sp1", listingData);
型
Visual Studio中的错误详细信息:
提示:没有过程匹配给定的名称和参数类型。您可能需要添加显式类型转换。
42883:过程test.sp1(p_data => jsonb)不存在
位置:6
添加了TableType:
CREATE TYPE Test.TableType1 AS (
Param1 Date,
Param2 varchar(50),
Param3 varchar(30),
Param4 int,
Param5 int,
Param6 decimal(3,1),
Param7 int,
Param8 varchar(255),
Param9 boolean,
Param10 boolean,
Param11 boolean,
Param12 varchar(50),
Param13 varchar(30),
Param14 varchar(150),
Param15 varchar(500),
Param16 varchar(255),
Param17 varchar(500),
Param18 int,
Param19 int,
Param20 int,
Param21 int,
Param22 int,
Param23 varchar(50),
Param24 varchar(30),
Param25 varchar(255),
Param26 varchar(50),
Param27 varchar(30),
Param28 varchar(255),
Param29 varchar(255),
Param30 varchar(10),
Param31 varchar(10),
Param32 varchar(30),
Param33 varchar(100),
Param34 varchar(255)
);
型
我是Postgresql的新手。如何解决这个问题?
1条答案
按热度按时间h9a6wy2h1#
不幸的是,你不能做你想做的事情。Npgsql没有
SqlDbType.Structured
的等价物,这将允许你传递一个DataTable
。相反,你必须将数据序列化为json。然而,这意味着你的存储过程必须有一个jsonb类型的参数,而不是Test.TableType1
。所以你需要相应地重写你的存储过程。假设你要把数据插入一个表中,它看起来像这样:
字符串
这假定表中的所有字段都按正确的顺序填充,否则需要在表名后面的括号中指定字段。
这个过程可以简化,如果你有一个表字段名和类属性名之间的精确Map(包括jsonb中的大小写敏感性)。然后你所需要的就是这样的东西:
型