一、创建数据库
首先,可以使用SQL Server Management Studio创建一个新的数据库(MyDatabase) 以及三个表(Users, Messages, UserMessageStatus),分别用于存储用户信息,消息信息以及用户消息状态。
Users表
该表包含了所有注册用户的信息。
| Field | Type | 
|---|---|
| id | int (PK) | 
| username | varchar(50) | 
| password | varchar(50) | 
Messages表
该表存储了所有的消息信息。
| Field | Type | 
|---|---|
| id | int (PK) | 
| title | varchar(50) | 
| content | varchar(500) | 
| created_time | datetime | 
UserMessageStatus表
该表用于记录每个用户与每个消息的关系,以及他们对消息的阅读状态。
| Field | Type | 
|---|---|
| id | int (PK) | 
| user_id | int (FK) | 
| message_id | int (FK) | 
| status | varchar(10) | 
其中,FK代表外键。
- 添加数据
 
在Users和Messages表中添加数据。
INSERT INTO Users VALUES (1, 'user1', 'password1') INSERT INTO Users VALUES (2, 'user2', 'password2')
INSERT INTO Messages VALUES (1, 'Message 1', 'This is message 1', '2023-06-06 10:00:00') INSERT INTO Messages VALUES (2, 'Message 2', 'This is message 2', '2023-06-05 10:00:00') INSERT INTO Messages VALUES (3, 'Message 3', 'This is message 3', '2023-06-04 10:00:00')
二、构建应用程序
现在,可以使用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.");
    }
} 
该程序首先要求用户进行登录,然后加载所有的消息并将它们按阅读状态分组。如果该消息已被该用户标记为已读,则显示[Read]标记。否则,显示[Unread]标记。最后,用户可以输入要将其标记为已读的消息的 ID。
在用户将消息标记为已读后,程序将调用UpdateUserMessageStatus方法,并将消息的ID和用户的ID传递给该方法,以便将消息的状态更新为“Read”。
三、效果演示:
1、运行程序,首先登录账号user2,password2,登录后可以看到有3条未读信息,如下所示:

2、选择第3条数据设置为已读,输入3后点回车后程序会关闭,如下所示:

3、再次运行程序查看,状态修改成功




















