Vb.net 有没有一个干净整洁的方法来处理零收益率?
我知道我可以做这样的事情;然而,有24个属性,我想使这部分尽可能干净Vb.net 有没有一个干净整洁的方法来处理零收益率?,vb.net,Vb.net,我知道我可以做这样的事情;然而,有24个属性,我想使这部分尽可能干净 While CommitReader.Read() Yield New Commit() With { .FirstValue = CommitReader.GetInt32(CommitReader.GetOrdinal("FirstValue")), .SecondValue = CommitReader.GetString(CommitReader.GetOrdinal("Seco
While CommitReader.Read()
Yield New Commit() With {
.FirstValue = CommitReader.GetInt32(CommitReader.GetOrdinal("FirstValue")),
.SecondValue = CommitReader.GetString(CommitReader.GetOrdinal("SecondValue")).Trim(),
'Lots of values
End While
有没有更好的方法来处理这类事情?我主要是一名C#开发人员,因此如果语法有点不正确,我将在VB中使用它。很遗憾SqlDataReader没有像DataRow那样的通用字段扩展方法,但是您可以定义自己的扩展方法(必须在VB.NET的模块中)来帮助进行空检查,可能类似这样:
While CommitReader.Read()
new Commit (){
Dim index As Integer = reader.GetOrdinal("FirstValue")
If reader.IsDBNull(index) Then
FirstValue = String.Empty
Else
FirstValue = reader(index)
End If
index = reader.GetOrdinal("SecondValue")
If reader.IsDBNull(index) Then
SecondValue = String.Empty
Else
SecondValue = reader(index)
End If
}
End While
<Extension>
Function GetValue(Of T)(rdr As SqlDataReader, i As Integer) As T
If rdr.IsDBNull(i) Then
Return Nothing
End If
Return DirectCast(rdr.GetValue(i), T)
End Function
我还没有对它进行全面测试,以确保它能够正确处理所有数据类型(可能值得查看DataRowExtensions.Field以了解它是如何做到的)
请注意,您正在使用String.Empty作为字符串的“null”值,而这将使用Nothing/null(我还必须删除.Trim调用以避免NREs)。如果您想要空字符串,可以使用(将修剪添加回):
您可能还希望将GetOrdinal调用移出循环以提高性能。SqlDataReader没有像DataRow那样的通用字段扩展方法,这是一个遗憾,但是您可以定义自己的扩展方法(必须在VB.NET的模块中)来帮助进行空检查,可能类似这样:
While CommitReader.Read()
new Commit (){
Dim index As Integer = reader.GetOrdinal("FirstValue")
If reader.IsDBNull(index) Then
FirstValue = String.Empty
Else
FirstValue = reader(index)
End If
index = reader.GetOrdinal("SecondValue")
If reader.IsDBNull(index) Then
SecondValue = String.Empty
Else
SecondValue = reader(index)
End If
}
End While
<Extension>
Function GetValue(Of T)(rdr As SqlDataReader, i As Integer) As T
If rdr.IsDBNull(i) Then
Return Nothing
End If
Return DirectCast(rdr.GetValue(i), T)
End Function
我还没有对它进行全面测试,以确保它能够正确处理所有数据类型(可能值得查看DataRowExtensions.Field以了解它是如何做到的)
请注意,您正在使用String.Empty作为字符串的“null”值,而这将使用Nothing/null(我还必须删除.Trim调用以避免NREs)。如果您想要空字符串,可以使用(将修剪添加回):
您可能还希望将GetOrdinal调用移出循环以提高性能。如果。。。否则…条件。
所以你可以用另一种方法提取它 对于您的情况,通用扩展方法似乎是一个很好的选择
.SecondValue = If(CommitReader.GetValue(Of String)(CommitReader.GetOrdinal("SecondValue")), String.Empty).Trim()
如果给定类型为DbNull
While CommitReader.Read() = True
Dim temp = new Commit With
{
Dim index As Integer = reader.GetOrdinal("FirstValue")
FirstValue = reader(index).GetValueOrDefault(String.Empty)
Dim index As Integer = reader.GetOrdinal("SecondValue")
FirstValue = reader(index).GetValueOrDefault(String.Empty)
}
End While
请注意,您的解决方案执行了两次reader
,以检查它是否为null并读取值。这可能会导致“微小”的性能问题
所以在上面的扩展方法中,我们只读取一次值,然后检查
DbNull
的值。显然,如果。。。否则…条件。所以你可以用另一种方法提取它 对于您的情况,通用扩展方法似乎是一个很好的选择
.SecondValue = If(CommitReader.GetValue(Of String)(CommitReader.GetOrdinal("SecondValue")), String.Empty).Trim()
如果给定类型为DbNull
While CommitReader.Read() = True
Dim temp = new Commit With
{
Dim index As Integer = reader.GetOrdinal("FirstValue")
FirstValue = reader(index).GetValueOrDefault(String.Empty)
Dim index As Integer = reader.GetOrdinal("SecondValue")
FirstValue = reader(index).GetValueOrDefault(String.Empty)
}
End While
请注意,您的解决方案执行了两次reader
,以检查它是否为null并读取值。这可能会导致“微小”的性能问题
因此,在上面的扩展方法中,我们只读取一次值,然后检查
DbNull
的值。如果将字符串与Null连接起来,则得到以下字符串:
While CommitReader.Read() = True
Dim temp = new Commit With
{
Dim index As Integer = reader.GetOrdinal("FirstValue")
FirstValue = reader(index).GetValueOrDefault(Of String)()
Dim index As Integer = reader.GetOrdinal("SecondValue")
FirstValue = reader(index).GetValueOrDefault(Of String)()
}
End While
有点“不专业”,但如果您所做的只是将可能的Null转换为空字符串,则可以节省大量的编码时间。但是,很容易忘记,因此以后可能会出现与数据相关的错误。如果将字符串与空字符串串联,则会得到以下字符串:
While CommitReader.Read() = True
Dim temp = new Commit With
{
Dim index As Integer = reader.GetOrdinal("FirstValue")
FirstValue = reader(index).GetValueOrDefault(Of String)()
Dim index As Integer = reader.GetOrdinal("SecondValue")
FirstValue = reader(index).GetValueOrDefault(Of String)()
}
End While
有点“不专业”,但如果您所做的只是将可能的Null转换为空字符串,则可以节省大量的编码时间。但是,很容易忘记,因此以后可能会出现与数据相关的错误。如果要将数据库空值转换为空字符串,可以在查询中执行此操作,例如,
SELECT COALESCE(FirstValue),”…
@AndrewMorton,同时解决方案工作,需要注意的是,这是一个关于在数据库层或业务逻辑层中保存此逻辑的更多问题。若您在数据库层中创建它,那个么您的业务逻辑假定数据库层总是返回空的strings@Fabio是的,我同意丢失列数据为NULL的信息可能是一个问题。如果要将数据库NULL值转换为空字符串,可以在查询中执行此操作,例如,SELECT COALESCE(FirstValue“”)…
@AndrewMorton,当您的解决方案工作时,需要注意更多关于您希望将此逻辑保留在何处的问题—在数据库层或业务逻辑层。若您在数据库层中创建它,那个么您的业务逻辑假定数据库层总是返回空的strings@Fabio是的,我同意丢失列数据为空的信息可能是一个问题。这个e类型对所有原语都安全吗,例如DateTime,Boolean?@Robert如果列可为null,则需要使用可为null的基元类型作为泛型参数-如示例中的integer所示,例如GetValue(Of DateTime?
),否则它将返回默认值,即DateTime.MinValue,或者对于integer类型返回零,这更有意义。感谢您提高了性能,您可以避免两次读取值-回答很好:)@Robert,因为它返回默认值false
对于Boolean
,DateTime.MinValue
对于DateTime
。此e类型对所有基本体(例如DateTime、Boolean)安全吗?@Robert如果列可为null,则需要使用可为null的基本体类型作为通用参数-如示例中的integer所示,例如GetValue(日期时间的?)
,否则它将返回默认值,即DateTime.MinValue,或者对于整数类型返回零,等等,这更有意义。感谢您提高了性能,您可以避免两次读取值-回答很好:)@Robert,因为它返回默认值false
用于Boolean
,DateTime.MinValue
用于DateTime
。如何“非专业”解决方案哪个。。。因此,以后可能会出现与数据相关的错误,这样可以节省编码时间?发生错误的原因可能是,作为一名编码器,您可能忘记添加空字符串。如果你的数据很少有经验