الطريقة الأولى: ADO.NET
دي الطريقة اللي بنستخدم فيها ADO.NET عشان نتعامل مع الـ Stored Procedure بشكل مباشر. هنفتح اتصال بقاعدة البيانات ونعمل استدعاء للـ Stored Procedure
ونتحكم في كل خطوة بنفسنا. خليني أوريك مثال.
مثال باستخدام ADO.NET
افرض عندك Stored Procedure في قاعدة البيانات اسمها GetUserById
، ودي بتاخد معامل واحد هو @UserId
وبتجيب بيانات المستخدم اللي ليه الـ ID ده.
هنمشي على الخطوات دي:
- فتح الاتصال بقاعدة البيانات باستخدام
SqlConnection
. - إعداد الاستعلام باستخدام
SqlCommand
وتحديد إن الـCommandType
هوStoredProcedure
. - إضافة المعاملات (لو في معاملات زي
@UserId
هنا). - تنفيذ الاستعلام وجلب النتائج في جدول بيانات (DataTable).
الكود هيبقى كده:
using System;
using System.Data;
using System.Data.SqlClient;
public class DatabaseHelper
{
private readonly string _connectionString;
public DatabaseHelper(string connectionString)
{
_connectionString = connectionString;
}
public DataTable GetUserById(int userId)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand("GetUserById", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
// إضافة المعامل
cmd.Parameters.Add(new SqlParameter("@UserId", userId));
// إعداد جدول البيانات عشان نحط فيه النتايج
DataTable dt = new DataTable();
try
{
// فتح الاتصال
connection.Open();
// استخدام SqlDataAdapter عشان نملى البيانات في DataTable
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
}
}
catch (Exception ex)
{
// لو حصل خطأ
Console.WriteLine("An error occurred: " + ex.Message);
}
return dt; // رجّع البيانات
}
}
}
}
إيه اللي بيحصل هنا؟
- إحنا بنفتح اتصال بقاعدة البيانات، وبنجهز
SqlCommand
اللي هنستدعي بيه الـStored Procedure
. - بنحدد إن نوع
CommandType
هوStoredProcedure
عشان نفهمه إننا بنشغل حاجة موجودة في قاعدة البيانات مش استعلام SQL عادي. - بنضيف المعامل
@UserId
. - بنشغل الـ
Stored Procedure
ونحط النتايج فيDataTable
. - بعد كده، بنرجع
DataTable
عشان نقدر نستخدمه في أي جزء تاني من البرنامج.
الطريقة التانية: Entity Framework (EF)
لو عايز تستخدم Entity Framework، دي بتبقى أسهل وبتخليك تتعامل مع البيانات على إنها كائنات (Objects).
الـ Entity Framework بيسهل عليك تنفيذ Stored Procedures
بدون ما تكتب كود كتير للتحكم في الاتصال والاستعلامات.
مثال باستخدام Entity Framework
خلينا نقول عندك نفس الـ Stored Procedure
اللي اسمه GetUserById
، وعايز تجيب بيانات المستخدم عن طريق Entity Framework. هنا هنمشي على خطوتين:
- تجهيز موديل (Model) يمثل بيانات الجدول اللي راجع من
Stored Procedure
، زيUser
هنا. - استخدام دالة FromSqlRaw عشان تنفذ
Stored Procedure
وتجيب البيانات.
الكود هيبقى كده:
أول حاجة، هنكتب موديل User
:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
تاني حاجة، هنضيف الدالة في DbContext
:
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
// دالة لاستدعاء Stored Procedure
public async Task<List<User>> GetUserByIdAsync(int userId)
{
return await Users
.FromSqlRaw("EXEC GetUserById @UserId = {0}", userId)
.ToListAsync();
}
}
إيه اللي بيحصل هنا؟
- بنعمل دالة
GetUserByIdAsync
فيDbContext
بتاعنا. - بنستخدم
FromSqlRaw
عشان نكتب اسم الـStored Procedure
(GetUserById
) ونمرر له المعاملuserId
. - بعدين بنستخدم
ToListAsync
عشان نرجع النتايج في صورة قائمة من كائناتUser
(List<User>
).
استخدام الدالة دي هيبقى كده:
public class UserService
{
private readonly AppDbContext _context;
public UserService(AppDbContext context)
{
_context = context;
}
public async Task<List<User>> GetUserById(int userId)
{
return await _context.GetUserByIdAsync(userId);
}
}
الفرق بين الطريقتين:
- الـADO.NET: بتديك تحكم أكتر، لكن بتحتاج منك كتابة كود أكتر عشان تتعامل مع قاعدة البيانات بشكل مباشر.
- الـEntity Framework: بتسهل عليك الشغل، وبتتعامل مع البيانات كـ Objects، وبتخليك تكتب كود أقل وتركز على منطق التطبيق بدل ما تركز على تفاصيل الاتصال بقاعدة البيانات.
باختصار:
- لو عايز تحكم كامل وبتحب تعمل كل حاجة بنفسك، استخدم ADO.NET.
- لو عايز شغل أسرع وتتعامل مع البيانات ككائنات، يبقى Entity Framework هي الأنسب ليك.