دليل خطوة بخطوة لتنفيذ عمليات CRUD في WPF باستخدام SQLite و#C

Amine
28/08/2024

مقدمة

SQLite هي قاعدة بيانات خفيفة الوزن تُستخدم في العديد من التطبيقات لتخزين البيانات محليًا. في هذا الدليل، سنقوم بإنشاء تطبيق WPF باستخدام لغة #C لتنفيذ عمليات CRUD على قاعدة بيانات SQLite.

الخطوة 1: إنشاء مشروع WPF جديد

  • افتح Visual Studio.
  • اختر “مشروع جديد” من القائمة.
  • اختر قالب WPF App (.NET Core).
  • قم بتسمية المشروع وانقر على “إنشاء”.

الخطوة 2: إضافة مكتبة SQLite

  • انقر بزر الماوس الأيمن على المشروع، واختر “إدارة الحزم باستخدام NuGet”.
  • ابحث عن System.Data.SQLite وقم بتثبيتها.

الخطوة 3: إعداد قاعدة البيانات

إنشاء ملف قاعدة البيانات SQLite: يمكنك إنشاء قاعدة البيانات عبر الكود التالي. هنا سننشئ قاعدة بيانات باسم database.db في مجلد التطبيق.

using System.Data.SQLite;
using System.IO;

public class DatabaseHelper
{
    private static string dbFile = "database.db";
    private static string connectionString = $"Data Source={dbFile};Version=3;";

    public static void InitializeDatabase()
    {
        if (!File.Exists(dbFile))
        {
            SQLiteConnection.CreateFile(dbFile);
            using (var connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                string createTableQuery = @"
                    CREATE TABLE Users (
                        Id INTEGER PRIMARY KEY AUTOINCREMENT,
                        Name TEXT NOT NULL,
                        Age INTEGER NOT NULL
                    );";
                SQLiteCommand command = new SQLiteCommand(createTableQuery, connection);
                command.ExecuteNonQuery();
            }
        }
    }

    public static SQLiteConnection GetConnection()
    {
        return new SQLiteConnection(connectionString);
    }
}

استدعاء تهيئة قاعدة البيانات: قم باستدعاء دالة InitializeDatabase عند بدء تشغيل التطبيق لضمان إنشاء قاعدة البيانات والجداول إذا لم تكن موجودة.

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        DatabaseHelper.InitializeDatabase();
    }
}

الخطوة 4: تنفيذ عملية Create (إنشاء)

إضافة بيانات إلى قاعدة البيانات: يمكنك إنشاء دالة لإضافة مستخدم جديد إلى جدول Users.

public static void AddUser(string name, int age)
{
    using (var connection = DatabaseHelper.GetConnection())
    {
        connection.Open();
        string insertQuery = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
        using (var command = new SQLiteCommand(insertQuery, connection))
        {
            command.Parameters.AddWithValue("@Name", name);
            command.Parameters.AddWithValue("@Age", age);
            command.ExecuteNonQuery();
        }
    }
}

استدعاء دالة الإضافة: يمكنك الآن استدعاء هذه الدالة لإضافة مستخدم جديد عند النقر على زر “إضافة” في واجهة المستخدم.

الخطوة 5: تنفيذ عملية Read (قراءة)

قراءة البيانات من قاعدة البيانات: يمكنك إنشاء دالة لاسترداد جميع المستخدمين من قاعدة البيانات.

public static List<User> GetAllUsers()
{
    var users = new List<User>();
    using (var connection = DatabaseHelper.GetConnection())
    {
        connection.Open();
        string selectQuery = "SELECT * FROM Users";
        using (var command = new SQLiteCommand(selectQuery, connection))
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                users.Add(new User
                {
                    Id = Convert.ToInt32(reader["Id"]),
                    Name = reader["Name"].ToString(),
                    Age = Convert.ToInt32(reader["Age"])
                });
            }
        }
    }
    return users;
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

عرض البيانات في واجهة المستخدم: يمكنك استخدام عنصر مثل DataGrid لعرض قائمة المستخدمين في واجهة المستخدم.

الخطوة 6: تنفيذ عملية Update (تحديث)

تحديث بيانات المستخدم: لإنشاء دالة لتحديث بيانات المستخدم:

public static void UpdateUser(int id, string name, int age)
{
    using (var connection = DatabaseHelper.GetConnection())
    {
        connection.Open();
        string updateQuery = "UPDATE Users SET Name = @Name, Age = @Age WHERE Id = @Id";
        using (var command = new SQLiteCommand(updateQuery, connection))
        {
            command.Parameters.AddWithValue("@Id", id);
            command.Parameters.AddWithValue("@Name", name);
            command.Parameters.AddWithValue("@Age", age);
            command.ExecuteNonQuery();
        }
    }
}

استدعاء دالة التحديث: استدعِ هذه الدالة عندما يقوم المستخدم بتعديل بيانات مستخدم موجود في واجهة التطبيق.

الخطوة 7: تنفيذ عملية Delete (حذف)

حذف المستخدم: لإنشاء دالة لحذف مستخدم من قاعدة البيانات:

public static void DeleteUser(int id)
{
    using (var connection = DatabaseHelper.GetConnection())
    {
        connection.Open();
        string deleteQuery = "DELETE FROM Users WHERE Id = @Id";
        using (var command = new SQLiteCommand(deleteQuery, connection))
        {
            command.Parameters.AddWithValue("@Id", id);
            command.ExecuteNonQuery();
        }
    }
}

استدعاء دالة الحذف: استدعِ هذه الدالة لحذف مستخدم معين عند اختيار المستخدم في واجهة المستخدم والضغط على زر “حذف”.

واجهة المستخدم

استخدم عناصر WPF مثل TextBox لإدخال البيانات، وDataGrid لعرض البيانات، وأزرار لتفعيل العمليات CRUD.

الخاتمة

في هذا الدليل، تعلمت كيفية إنشاء تطبيق WPF بسيط باستخدام SQLite لتنفيذ عمليات CRUD (إنشاء، قراءة، تحديث، حذف). يمكنك تحسين هذا التطبيق بإضافة واجهة مستخدم متقدمة، والتحقق من صحة البيانات، والتعامل مع الأخطاء.

الكود الكامل

using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.IO;
using System.Windows;

namespace WpfAppWithSQLite
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            DatabaseHelper.InitializeDatabase();
        }
    }

    public class DatabaseHelper
    {
        private static string dbFile = "database.db";
        private static string connectionString = $"Data Source={dbFile};Version=3;";

        public static void InitializeDatabase()
        {
            if (!File.Exists(dbFile))
            {
                SQLiteConnection.CreateFile(dbFile);
                using (var connection = new SQLiteConnection(connectionString))
                {
                    connection.Open();
                    string createTableQuery = @"
                        CREATE TABLE Users (
                            Id INTEGER PRIMARY KEY AUTOINCREMENT,
                            Name TEXT NOT NULL,
                            Age INTEGER NOT NULL
                        );";
                    SQLiteCommand command = new SQLiteCommand(createTableQuery, connection);
                    command.ExecuteNonQuery();
                }
            }
        }

        public static SQLiteConnection GetConnection()
        {
            return new SQLiteConnection(connectionString);
        }
    }

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class UserRepository
    {
        public static void AddUser(string name, int age)
        {
            using (var connection = DatabaseHelper.GetConnection())
            {
                connection.Open();
                string insertQuery = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
                using (var command = new SQLiteCommand(insertQuery, connection))
                {
                    command.Parameters.AddWithValue("@Name", name);
                    command.Parameters.AddWithValue("@Age", age);
                    command.ExecuteNonQuery();
                }
            }
        }

        public static List<User> GetAllUsers()
        {
            var users = new List<User>();
            using (var connection = DatabaseHelper.GetConnection())
            {
                connection.Open();
                string selectQuery = "SELECT * FROM Users";
                using (var command = new SQLiteCommand(selectQuery, connection))
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        users.Add(new User
                        {
                            Id = Convert.ToInt32(reader["Id"]),
                            Name = reader["Name"].ToString(),
                            Age = Convert.ToInt32(reader["Age"])
                        });
                    }
                }
            }
            return users;
        }

        public static void UpdateUser(int id, string name, int age)
        {
            using (var connection = DatabaseHelper.GetConnection())
            {
                connection.Open();
                string updateQuery = "UPDATE Users SET Name = @Name, Age = @Age WHERE Id = @Id";
                using (var command = new SQLiteCommand(updateQuery, connection))
                {
                    command.Parameters.AddWithValue("@Id", id);
                    command.Parameters.AddWithValue("@Name", name);
                    command.Parameters.AddWithValue("@Age", age);
                    command.ExecuteNonQuery();
                }
            }
        }

        public static void DeleteUser(int id)
        {
            using (var connection = DatabaseHelper.GetConnection())
            {
                connection.Open();
                string deleteQuery = "DELETE FROM Users WHERE Id = @Id";
                using (var command = new SQLiteCommand(deleteQuery, connection))
                {
                    command.Parameters.AddWithValue("@Id", id);
                    command.ExecuteNonQuery();
                }
            }
        }
    }
}

التعليقات

اترك تعليقاً