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は外部キーの略です。
- データの追加
ユーザー テーブルとメッセージ テーブルにデータを追加します。
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. プログラムを再度実行して、ステータスの変更が成功したことを確認します。