我们的大部分开发都是在vb.net(不是我的选择)中完成的,一个经常使用的代码模式使用“On Error GoTo”,后跟“继续下一步”,以便所有数据库字段都可以使用DirectCast()和DBNull值被忽略.
当前的代码将是
On Error GoTo error_code oObject.Name = DirectCast(oReader.Item("Name"),String) oObject.Value = DirectCast(oReader.Item("Value"),Integer) error_code: Resume Next
oObject.Name = oReader["Name"] as string ?? string.Empty; oObject.Value = oReader["Value"] as int? ?? -1;
问题是这个C#代码的vb.net eqivelent使用TryCast(),它只能用于引用类型(可空类型是值类型),而C#as关键字可以用于引用和可空类型.
所以总结有没有人有一个vb.net代码的例子,与每个数据库字段的单行中的C#代码相同?
-编辑-
我决定了我认为是我们案例中最好的解决方案. Helper方法不适合(由于管理),我们不能使用扩展方法,因为我们只使用.NET 2.0(尽管使用VS 2008,所以我们得到了If())
oObject.Name = If(oReader.IsDBNull(oReader.GetOrdinal("Name")),String.Empty,oReader.GetString(oReader.GetOrdinal("Name"))) oObject.Value = If(oReader.IsDBNull(oReader.GetOrdinal("Value")),oReader.GetInt32(oReader.GetOrdinal("Value")))
在VB 9.0中,“IF”是一个真正的合并操作,相当于C#的“??”.
来源 MSDN:
来源 MSDN:
所以你可以使用:
oObject.Name = IF(oReader.Item("Name").Equals(DBNull.Value),string.Empty,DirectCast(oReader.Item("Name"),String))