1

我创建了这个简单的测试来从存储过程中读取数据。我一定忽略了一些明显的东西,因为我不知道为什么我继续没有数据。

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
4

2 回答 2

1

首先,尝试在您的管理工作室中使用提供的汽车 ID 运行查询,以查看它传回的结果。其次,我会尝试如下更改 if 语句,看看是否还有问题:

If Not myReader.IsDBNull(0) Then 

此外,所有允许 NULL 值的后续字段必须在使用前检查 IsDBNull。这也可能导致一些问题。

于 2013-08-22T20:28:02.047 回答
1

从 MSDN 关于SqlDataReader.GetStringMethod 方法:

不执行任何转换;因此,检索到的数据必须已经是一个字符串。

在调用此方法之前调用 IsDBNull 以检查空值。

我的猜测是IsDBNull.myReader.GetString(0)返回False,因为CarId它不是一String列(它是uniqueidentifier)。

相反,要测试值是否为空,请尝试使用SqlDataReader.IsDBNull适用于任何数据类型的方法。

If Not myReader.IsDBNull(0) Then 
于 2013-08-22T20:37:25.897 回答