在Insight.Database中处理可为空参数的正确/最佳方法是什么?

时间:2014-11-06 13:55:29

标签: .net sql-server insight.database

我一直在使用Insight.Database大约一年来调用存储过程,但我只是遇到了一个情况,即存储过程具有一个默认的可为空的参数,Insight没有像我那样处理期待。

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

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

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

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

1 个答案:

答案 0 :(得分: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)

您可以通过完全省略参数来完成此操作:

class Foo { /* Param not bound */ }

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

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

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

class Foo { [NullMeansUseDefault] string Param; }

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

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

处打开一个问题