我正在搜索数据库并从中提取结果。在WPF中显示之前,我正在检查名为PrimarySponsor的字段中的文本内容,该字段可以是(1)第3个字符的空白/空(2)数字(3)人名。我目前正在使用Char.IsNumber检查选项2,如果在第4位有一个数字。
If reader("PrimarySponsor") Is DBNull.Value Then
resultxPrimSpon = ""
ElseIf Char.IsNumber(reader("PrimarySponsor"), 3) Then
resultxPrimSpon = "Terminated"
Else
resultxPrimSpon = reader("PrimarySponsor")
End If
在我将Char.IsNumber检入之前,我显示了4个结果。当我添加Char.IsNumber代码时,我只得到2个结果和错误;
连接到SQLServer时出错.Sepcified参数超出了有效值范围。参数名称:index。
任何人对于为什么会发生这种情况或如何解决这个问题都有任何想法?
答案 0 :(得分:2)
由于ArgumentOutOfRangeException
不是sql-server方法,因此不清楚从哪里得到该错误。所以我认为它是您的自定义消息。但是,"指定参数超出范围" 为documented:
String
:index小于零或大于 s中的最后一个位置。
所以看起来至少有一个字符串短于4个字符。通常,如果您必须多次访问它,则应将读取器值存储在正确类型的变量中。在这种情况下,在List(Of T)
- 变量。
但创建具有所有属性的自定义类型也是一个好主意。然后,您可以将所有内容添加到Public Class Sponsor
Public Property PrimarySponsor As String
End Class
。这是一个例子:
List(Of String)
当然,您也可以填写List(Of Sponsor)
而不是Dim allSponsors As New List(Of Sponsor)
Using reader = command.ExecuteReader()
If reader.HasRows Then
Dim primSponsorColumnIndex = reader.GetOrdinal("PrimarySponsor")
While reader.Read
Dim sponsor As New Sponsor()
If reader.IsDBNull(primSponsorColumnIndex) Then
sponsor.PrimarySponsor = ""
Else
sponsor.PrimarySponsor = reader.GetString(primSponsorColumnIndex)
If sponsor.PrimarySponsor.Length >= 4 AndAlso _
Char.IsDigit(sponsor.PrimarySponsor(3)) Then
sponsor.PrimarySponsor = "Terminated"
End If
End If
allSponsors.Add(sponsor)
End While
End If
End Using
。然后,您不需要创建新类型。但我假设你在表格中有多个列。使用自定义类型可以提高可读性和可维护性。
...
DataReader.IsDBNull
首先使用Null
检查值是否为Length >= 4
。然后在使用Char.IsDigit(sponsor.PrimarySponsor(3))
之前检查是否ArgumentOutOfRangeException
以避免li{
display:inline-block;
}
。