使用 ADO .NET 获取 JSON 数据时出现 System.IndexOutOfRangeException 异常

问题描述 投票:0回答:1

我有一个包含用户详细信息的简单表格: [Table structure](https://i.stack.imgur.com/hQuY7.png)

这是我的SP:

ALTER PROCEDURE [dbo].[Login]
    @userName VARCHAR(50)
    ,@password VARCHAR(50)
    AS
    BEGIN
        SELECT USERID AS Id, (FIRST_NAME+' '+LAST_NAME) AS NAME, EMAIL AS email FROM [dbo].    [USER] WHERE USERNAME = @userName AND PASSWORD = @password
    FOR JSON AUTO
    END

我写的ADO.NET代码如下:

SqlDataReader reader = sqlCommand.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine(reader["Id"].ToString() + ' ' + reader["email"].ToString());
}

当我尝试调试代码或只是运行它时,它会在带有“Console.WriteLine”语句的行中抛出以下异常:

System.IndexOutOfRangeException HResult=0x80131508 消息=Id Source=Microsoft.Data.SqlClient

当我将我的 SP 修改为没有“FOR JSON AUTO”部分时,代码运行正常并且我得到了预期的结果。 但是一旦我添加“For JSON AUTO”,我就开始遇到异常。

我在一些网站上搜索了该解决方案,但没有找到。他们中的大多数人建议检查列名是否正确,所以我直接从 SP 中复制并粘贴列名。但无济于事。

有人知道如何解决这个问题吗?

c# json stored-procedures ado.net
1个回答
0
投票

因为您的数据被转换为 JSON 数组,并且数据集将结果作为单个行和列返回。

获取行中的第一列:

reader.GetValue(0)

并且您应该使用 JSON 序列化程序库,例如 System.Text.JsonNewtonsoft.Json 将值提取为

JArray
.

using Newtonsoft.Json.Linq;

while (reader.Read())
{
    Console.WriteLine(reader.GetValue(0));
    JArray jArray = JArray.Parse(reader.GetValue(0).ToString());
                    
    foreach (JObject jObj in jArray)
        Console.WriteLine(jObj["Id"].ToString() + ' ' + jObj["email"].ToString());
}
© www.soinside.com 2019 - 2024. All rights reserved.