【解決方法】system.indexoutofrangeexception を解決する方法


I have a simple table with user details with following columns:

USERID  INT
FIRST_NAME  VARCHAR(50)
LAST_NAME VARCHAR(50)
EMAIL  VARCHAR(100)
COUNTRY  VARCHAR(50)
USERNAME  VARCHAR(50)
PASSWORD  VARCHAR(50)

これは私が持っている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
The ADO .NET code that I wrote is as follows:
SqlDataReader reader = sqlCommand.ExecuteReader();

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

コードをデバッグするか、単に実行しようとすると、「Console.WriteLine」ステートメントの行に次の例外がスローされます。

System.IndexOutOfRangeException
HResult=0x80131508
メッセージ=ID
ソース=Microsoft.Data.SqlClient

私が試したこと:

「FOR JSON AUTO」部分を持たないように SP を変更すると、コードは正常に実行され、期待される結果が得られます。
しかし、「For JSON AUTO」を追加するとすぐに、例外が発生し始めます。

解決策についていくつかのサイトを検索しましたが、何も見つかりませんでした。 彼らのほとんどは、列名が正しいかどうかを確認することを提案したので、列名を SP から直接コピーして貼り付けました。 しかし、役に立たない。

これを解決する方法について何か考えがある人はいますか?

解決策 1

列名を実際に返されたものと一致させます。

SELECT は「Id」、「NAME」、「email」という列を返し、C# コードは「USERID」と「EMAIL」を想定しています。

しかし、そのようにしないでください。 パスワードをクリア テキストで保存しないでください。これは重大なセキュリティ リスクです。 ここにそれを行う方法に関するいくつかの情報があります: パスワードの保管: 方法。[^]

覚えておいてください: これが Web ベースであり、欧州連合のユーザーがいる場合、GDPR が適用されます。つまり、パスワードを機密データとして扱い、安全な方法で保管する必要があります。 テキストはそれらのどちらでもなく、罰金は….うーん…傑出している可能性があります。 2018 年 12 月、ドイツの会社は、それだけで 20,000 ユーロという比較的低い罰金を科されました。

コメント

タイトルとURLをコピーしました