我一直在使用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。
答案 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
处打开一个问题