Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 有没有一个干净整洁的方法来处理零收益率?_Vb.net - Fatal编程技术网

Vb.net 有没有一个干净整洁的方法来处理零收益率?

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

我知道我可以做这样的事情;然而,有24个属性,我想使这部分尽可能干净

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
。如何“非专业”解决方案哪个。。。因此,以后可能会出现与数据相关的错误,这样可以节省编码时间?发生错误的原因可能是,作为一名编码器,您可能忘记添加空字符串。如果你的数据很少有经验