在vb.net

时间:2016-01-11 08:52:05

标签: sql sql-server wpf vb.net

我正在搜索数据库并从中提取结果。在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。

任何人对于为什么会发生这种情况或如何解决这个问题都有任何想法?

1 个答案:

答案 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; }

Difference between Char.IsDigit() and Char.IsNumber() in C#