我有一个这样声明的 SqlDataReader:
Dim myReader As SqlDataReader
myReader = SqlHelper.ExecuteReader(ConnectionString, "storedProcedure1", CInt(myTextBox.Text))
后来我使用这样的结果:
If myReader.HasRows Then
While myReader.Read()
Row = Table1.NewRow()
Row.Item("REF") = myReader.GetString(0)
Row.Item("CD") = myReader.GetString(1)
Row.Item("NAME") = myReader.GetString(2)
Row.Item("KEY") = myReader.GetDecimal(3)
Row.Item("STRING") = myReader.GetString(0) & " - " & myReader.GetString(1) & " - " & myReader.GetString(2).ToString().Replace("'", "") & " - " & myReader.GetString(4).ToString().Replace("'", "")
Table1.Rows.Add(Row)
'Fill Drop Down
drpMenu.Items.Add(New ListItem(myReader.GetString(0) & " - " & myReader.GetString(1) & " - " & myReader.GetString(2).ToString().Replace("'", "") & " - " & myReader.GetString(4).ToString().Replace("'", "")))
End While
End If
myTextBox
是一个文本框,用户输入一个可能的位置编号,使用存储过程进行搜索。如果用户输入有效的位置号码,这很好用,我没有问题。如果他们输入一个不存在的位置号码,我会得到一个例外:
System.IndexOutOfRangeException:索引超出了数组的范围。
我认为这If myReader.HasRows
条线会阻止我尝试阅读和操纵不存在的结果,但一定有我遗漏的东西。myTextBox
已经在代码的其他地方进行了验证,以确保用户输入的整数没有任何古怪的字符,因此错误的输入似乎也不是问题。
如何在拨打电话前确定位置号码是否存在SqlHelper.ExecuteReader()
?或者也许更好的问题是我如何优雅地处理这个异常并告诉用户找不到位置?
编辑:这是存储过程。
ALTER PROCEDURE [dbo].[storedProcedure]
-- Add the parameters for the stored procedure here
@MBR as integer
AS
BEGIN
EXEC ('{CALL RM#IMLIB.spGETLOC( ?)}', @MBR) at AS400
END
编辑#2:当我在 SMS 中运行存储过程并传递一个有效位置时,它会返回我所期望的。如果我传递了无效的位置编号,它不会返回任何内容。