gpt4 book ai didi

arrays - 使用 F# 中的 Npgsql 传入和传出 postgresql 存储过程的数组参数

转载 作者:行者123 更新时间:2023-11-29 12:17:39 25 4
gpt4 key购买 nike

我在 postgresql 中有两个 SQL 函数(过程)。他们获取并返回数组;他们的签名是

create function arr_ret( x int) returns int[] as

create function arr_param( x int[] ) returns int as

执行时第一个函数返回

> ctx.Functions.ArrRet.Invoke(6);;
Executing SQL : EXEC arr_ret(6) - params
val it : Unit = ()

>

可以看出,invoke操作的签名是Unit() = ();不返回任何东西。我本来期望 Unit() = int list 因为该过程应该返回一个整数数组。

执行时的第二个函数

> ctx.Functions.ArrParam.Invoke( [1;2;3;4;5;6] );;
ctx.Functions.ArrParam.Invoke( [1;2;3;4;5;6] );;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

stdin(22,1): error FS0501: The member or object constructor 'Invoke' takes 0 argument(s) but is here given 1. The requir
ed signature is 'SqlDataProvider<...>.dataContext.Functions.ArrParam.Result.Invoke() : SqlDataProvider<...>.dataContext.
Functions.ArrParam.Result.SprocResult'.

Npgsql 没有看到数组类型的参数(输入或输出)。文档说 3.0+ 版本支持 postgresql 数组和复合类型,我使用的是最新的 3.2.3

最佳答案

您正在将类型为 FSharpList 的单个参数发送到需要参数的方法中。您使用它的方式会将整个列表作为单个参数发送。

ctx.Functions.ArrParam.Invoke(1, 2, 3, 4, 5, 6);;

以上将根据您的需要单独发送它们,但如果您通过整个集合则不会。原因是类型提供者试图解析对象的类型,而不是将整个数组视为多个参数。在 C# 中,这可以正常工作,但在 F# 中则不行。

这是一个很好的测试方法。

在 C# 中定义这个方法:

public static void PrintArgs(params object[] args)
{
foreach (var arg in args)
{
Console.WriteLine($"Type: {arg.GetType().Name}");
}
}

在 F# 中称它为:

PrintArgs(1, 2.0, true, "4")

PrintArgs([1; 2; 3; 4])

它们导致:

> 
Type: Int32
Type: Double
Type: Boolean
Type: String
val it : unit = ()

>
Type: FSharpList`1
val it : unit = ()

>

你的问题是在第二次调用中发生了什么,它实际上是一个正在发送的列表而不是多个参数。

关于arrays - 使用 F# 中的 Npgsql 传入和传出 postgresql 存储过程的数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com