这是我的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 中复制并粘贴列名。但无济于事。
有人知道如何解决这个问题吗?
因为您的数据被转换为 JSON 数组,并且数据集将结果作为单个行和列返回。
获取行中的第一列:
reader.GetValue(0)
并且您应该使用 JSON 序列化程序库,例如 System.Text.Json 或 Newtonsoft.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());
}