[ad_1]
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 ユーロという比較的低い罰金を科されました。
[ad_2]
コメント