2015-12-21 18 views
1

我有一个类类型的对象,如:我怎样才能更有效地应对DBNull.value在vb.net/SQL服务器

Private Class Car 
    Public Property Make As String 
    Public Property Model As String 
    Public Property Used As Boolean? 
    Public Property Mileage As Integer? 
    Public Property DateSold As Date? 
End Class 

我解析说会发布到我的网页查询字符串可能有或没有上述属性的键/值对。例如,它可能只是:

?Make=Toyota 

我有一个基于公共属性,您在上面看到在SQL Server中的表,我让所有列空值。 (我的实际数据有更多的领域,所以这是解释的目的)

CREATE PROCEDURE InsertCar 
    @Make varchar(25), 
    @Model varchar(25), 
    etc. 

我不是在上面的存储过程的参数设置默认值。我想知道一个更简洁的方法来从代码中做到这一点。

例如:

的数据贴到我的网页...我用httputility解析它,我可以建立一个新的对象,如:

Dim record As New Car 
record.Make = Data("make") 
record.Model = Data("model") 
record.Used = Data("used") 
record.Mileage = Data("mileage") 
record.DateSold = Data("datesold") 

之后,我建一些参数为我的存储过程,但在这里,我想我可以改进:

Dim pars As New List(Of SqlParameter) 
pars.Add(New SqlParameter("@Make", If(record.Make = Nothing, DBNull.Value, record.Make)) 
and so on... 

所以你可以看到我的三元运营商建立的参数。有没有更清晰的方式,或许使用默认值,或者当班级被整合在一起使这个更清洁?

这是我认为更精确和最佳实践问题。我应该将DBNull.Value分配给公共属性吗?或者我是如何做得足够的?有没有更清晰的方法来映射可空属性?

我将来自查询字符串的值分解为一个NameValueCollection,那么是否有一种更简单的方法来迭代存在的方法,如果不存在于类中,则自动使用DBNull.Value构建参数?

我希望我的问题有道理。有了大量的数据,它看起来像所有的if/then DBNull.value都很丑陋,等等。我觉得我可以在这个过程中为自己省下一步。类对象对组织很有帮助,并在代码的其他部分使用,否则我可能只是建立参数并完成它。

回答

2

您可以在存储过程参数中设置默认值。

CREATE PROCEDURE InsertCar 
    @Make varchar(25) = null, 
    @Model varchar(25) = null 
    ... 

而只是通过你的对象,如果是空/缺少的存储过程将默认缺少paramater值设置为null

pars.Add(New SqlParameter("@Make", record.Make)) 

的SQL表还需要接受空值。

或者,使用vb.net IF()操作有两个参数

pars.Add(New SqlParameter("@Make", If(record.Make,DBNull.Value)) 

Is there a VB.NET equivalent for C#'s '??' operator?

+0

谢谢,意识到这一点,虽然。正如我的问题所提到的,我在考虑更多的学习目的,以便在vb.net中更好地处理这一切。 – user1447679

+0

可能使用null合并运算符:pars.Add(新建SqlParameter(“@ Make”,(object)record.Make ?? DBNull.Value)) – Shep

+0

从未见过......现在就试试! – user1447679