2

我已经使用Insight.Database大约一年来调用存储过程,但我只是遇到了这样一种情况,即存储过程有一个可默认为空的参数,而 Insight 没有按我的预期处理。

简而言之,参数定义为paramName nvarchar(10) = ''。调用此过程的代码是老式的 SqlCommand/SqlParam 代码,根本没有设置参数。我用 .net 对象替换它:

Class MyObject
    Public Property paramName As String
    ....
End Class

假设您创建了一个这种类型的对象,不要设置paramName并将其传递给 proc。我原以为 proc 会使用默认值。但是发生的事情是 Insight 向 proc 发送了一个 NULL 值,这与不发送任何内容不同,proc 看到指定的参数,因此不使用默认值,而这个特定的 proc 实际处理的 NULL 是不同于默认的方式,它破坏了应用程序。

我认为该错误存在于 proc 中,但我仍然需要一种方法来控制可为空的参数行为,以便我可以调用这种我无法修改的 procs。

4

1 回答 1

2

我很高兴您在 Insight.Database 上取得了一年的成功。

当 Insight 将对象绑定到参数列表时,它会映射任何匹配的属性。

所以:

class Foo { string Param; }
CREATE PROC MyProc (@Param varchar(50))

Foo.Param 映射到 @Param

在大多数简单的情况下,编码人员希望 NULL 映射到 DBNull.Value。因此,如果 Param 为 NULL,Insight 将绑定参数并将@Param 设置为 (DB)NULL。

当您使用 ADO.NET 调用带有默认参数的存储过程时,您通常会省略该参数或不设置该值。ADO.NET 然后告诉服务器使用默认值。

CREATE PROC MyProc (@Param varchar(50) = NULL)

您可以通过完全省略参数来使用 Insight 执行此操作:

class Foo { /* Param not bound */ }

然后 Insight 保留该值未绑定,ADO.NET 将使用默认值。

我没有遇到过必须在同一个过程中同时使用默认参数和 NULL 值的情况。

所以最简单的解决方案是省略参数,但如果这不起作用,我可能可以添加一个功能,让您控制 NULL 的含义。像:

class Foo { [NullMeansUseDefault] string Param; }

当然,我想要一个更好的属性名称。

如果您认为该功能可以解决您的问题,请在 https://github.com/jonwagner/Insight.Database/issues打开一个问题

于 2014-11-07T14:11:36.370 回答