我创建了这个简单的测试,用于从存储过程中读取数据。我必须忽略一些显而易见的事情,因为我无法弄清楚为什么我继续没有数据。
myReader.HasRows永远是真的。
我注意到它返回了正确的行数,但是我无法获取可能在行中的任何数据。
存储过程
ALTER PROCEDURE [dbo].[testProc]
-- Add the parameters for the stored procedure here
@carID uniqueidentifier
AS
BEGIN
SELECT * FROM carTable WHERE carID=@carID
END
VB.Net
Dim cmd As New SqlClient.SqlCommand("testProc", _conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("carID", carID)
_conn.Open()
Dim myReader As SqlDataReader
myReader = cmd.ExecuteReader()
If myReader.HasRows = True Then
While (myReader.Read())
If Not IsDBNull(myReader.GetString(0)) Then
' do stuff here
End If
End While
End If
答案 0 :(得分:1)
首先,尝试使用提供的车辆ID在管理工作室中运行查询,以查看它返回的结果。其次,我会尝试更改if语句,如下所示,看看你是否还有问题:
If Not myReader.IsDBNull(0) Then
此外,在使用IsDBNull之前,必须检查允许NULL值的所有后续字段。这也可能会导致一些问题。
答案 1 :(得分:1)
来自MSDN关于SqlDataReader.GetString
方法方法:
不进行转换;因此,检索的数据必须 已经是一个字符串。
调用IsDBNull以检查之前的空值 调用这种方法。
我的猜测是IsDBNull.myReader.GetString(0)
返回False
,因为CarId
不是String
列(uniqueidentifier
}。
相反,要测试的是值为null,请尝试使用适用于任何数据类型的SqlDataReader.IsDBNull
方法。
If Not myReader.IsDBNull(0) Then