C#: 異なるログイン ユーザーの読み取りステータスの変更: 異なるログイン ユーザー、ログイン ユーザーが読み取りステータスを変更した後、ステータスは既読になり、読み取りステータスを変更していないユーザーには未読のプログラム インスタンスが表示されたままになります。

1. データベースを作成する

まず、SQL Server Management Studio を使用して、新しいデータベース (MyDatabase) と 3 つのテーブル (Users、Messages、UserMessageStatus) を作成します。これらのテーブルは、ユーザー情報、メッセージ情報、およびユーザー メッセージのステータスを保存するために使用されます。

ユーザーテーブル

このテーブルには、登録されているすべてのユーザーに関する情報が含まれています。

分野 タイプ
ID 整数 (PK)
ユーザー名 varchar(50)
パスワード varchar(50)

メッセージテーブル

このテーブルにはすべてのメッセージ情報が保存されます。

分野 タイプ
ID 整数 (PK)
タイトル varchar(50)
コンテンツ varchar(500)
作成時刻 日付時刻

UserMessageStatus テーブル

このテーブルは、各ユーザーと各メッセージの関係、およびメッセージの読み取りステータスを記録するために使用されます。

分野 タイプ
ID 整数 (PK)
ユーザーID 整数 (FK)
メッセージID 整数 (FK)
スターテス varchar(10)

このうちFKは外部キーの略です。

  1. データの追加

ユーザー テーブルとメッセージ テーブルにデータを追加します。

INSERT INTO ユーザーの値 (1, 'user1', 'password1') INSERT INTO ユーザーの値 (2, 'user2', 'password2')

INSERT INTO メッセージ VALUES (1, 'メッセージ 1', 'これはメッセージ 1', '2023-06-06 10:00:00') INSERT INTO メッセージ VALUES (2, 'メッセージ 2', 'これはメッセージ 2' , '2023-06-05 10:00:00') INSERT INTO Messages VALUES (3, 'メッセージ 3', 'これはメッセージ 3', '2023-06-04 10:00:00')

2. アプリケーションを構築する

これで、C# を使用して、ユーザー ログインとメッセージ読み取りステータスの更新を実装するプログラムを作成できるようになりました。

まず、ユーザー情報を表す User クラスを作成します。

public class User
{
   public int Id { get; set; }
   public string Username { get; set; }
   public string Password { get; set; }
}

次に、メッセージ情報を表す Message クラスを作成します。

public class Message
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime CreatedTime { get; set; }
}

ユーザーとメッセージの関係を表す UserMessageStatus クラスを作成します。

public class UserMessageStatus
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int MessageId { get; set; }
    public string Status { get; set; }
}

次に、データベース内のデータを操作するためのデータ アクセス クラスを定義します。

public class DataAccess
{
   private readonly string connectionString = "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;";

   public List<User> GetUsers()
   {
      string query = "SELECT * FROM Users";
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
          List<User> users = connection.Query<User>(query).ToList();
          return users;
      }
   }

   public List<Message> GetMessages()
   {
      string query = "SELECT * FROM Messages";
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
          List<Message> messages = connection.Query<Message>(query).ToList();
          return messages;
      }
   }

   public List<UserMessageStatus> GetUserMessageStatus(int userId)
   {
      string query = $"SELECT * FROM UserMessageStatus WHERE user_id = {userId}";
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
          List<UserMessageStatus> userMessageStatuses = connection.Query<UserMessageStatus>(query).ToList();
          return userMessageStatuses;
      }
   }

   public void UpdateUserMessageStatus(int userId, int messageId)
   {
      string query = $"UPDATE UserMessageStatus SET status = 'Read' WHERE user_id = {userId} AND message_id = {messageId}";
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
          connection.Execute(query);
      }
   }
}

このうち、GetUsers() はすべての登録ユーザーの取得に使用され、GetMessages() はすべてのメッセージの取得に使用され、GetUserMessageStatus(userId) は特定のユーザーのすべてのメッセージ ステータスの取得に使用され、UpdateUserMessageStatus(userId, messageId) はマーク付けに使用されます。指定されたメッセージを既読として表示します。

最後に、ユーザーがログインしてメッセージを表示し、既読としてマークできるようにするメイン プログラムを作成します。

class Program
{
   static void Main(string[] args)
   {
      DataAccess dataAccess = new DataAccess();

      Console.WriteLine("Please log in:");
      Console.Write("Username: ");
      string username = Console.ReadLine();
      Console.Write("Password: ");
      string password = Console.ReadLine();

      List<User> users = dataAccess.GetUsers();
      User user = users.SingleOrDefault(u => u.Username == username && u.Password == password);
      if (user == null)
      {
         Console.WriteLine("Invalid user.");
         return;
      }

      List<Message> messages = dataAccess.GetMessages();
      foreach (Message message in messages)
      {
         List<UserMessageStatus> userMessageStatuses = dataAccess.GetUserMessageStatus(user.Id);
         UserMessageStatus userMessageStatus = userMessageStatuses.SingleOrDefault(ums => ums.MessageId == message.Id);
         if (userMessageStatus != null && userMessageStatus.Status == "Read")
         {
             Console.WriteLine("[Read] {0} - {1} ({2})", message.CreatedTime, message.Title, message.Content);
         }
         else
         {
             Console.WriteLine("[Unread] {0} - {1} ({2})", message.CreatedTime, message.Title, message.Content);
         }
      }

      Console.Write("Enter the ID of the message you want to mark as read: ");
      int messageId = int.Parse(Console.ReadLine());

      dataAccess.UpdateUserMessageStatus(user.Id, messageId);

      Console.WriteLine("Message marked as read.");
    }
}

このプログラムは、まずユーザーにログインを要求し、次にすべてのメッセージをロードし、読み取りステータスごとにグループ化します。メッセージがこのユーザーによってすでに既読としてマークされている場合、[既読] フラグが表示されます。それ以外の場合は「未読」マークが表示されます。最後に、ユーザーは既読としてマークしたいメッセージの ID を入力できます。

ユーザーがメッセージに既読のマークを付けた後、プログラムは UpdateUserMessageStatus メソッドを呼び出し、メッセージの ID とユーザーの ID を渡して、メッセージのステータスを「既読」に更新します。

3. 効果のデモンストレーション:

1. プログラムを実行し、まずアカウント user2、password2 でログインします。ログイン後、以下に示すように、未読メッセージが 3 件あることがわかります。

 2. 3 番目のデータを選択し、既読として設定します。3 を入力して Enter キーを押すと、次のようにプログラムが閉じます。

 3. プログラムを再度実行して、ステータスの変更が成功したことを確認します。

 

おすすめ

転載: blog.csdn.net/chentiebo/article/details/131088497