PDA

View Full Version : سوال: افزودن event به تمامی SQLCommand های یک پروژه



fotrosi
سه شنبه 08 مهر 1393, 13:01 عصر
با سلام، برای یک پروژه نسبتا بزرگ قراره لاگ کوئری های اجرا شده بر روی اسکیول سرور را ذخیره کنیم به همین منظور می خواهم به تمام اشیاء SqlCommand موجود در پروژه که خیلی هم زیادند (حدود 1000 شئی) از رویداد StatementCompleted استفاده کنم و کوئری درون SqlCommand را در دیتابیس ذخیره کنم. به نظر شما چه راهکاری برای اینکه اینکار را 1000 بار تکرار نکنم وجود داره؟ آیا از روشهای برنامه نویسی شئی گرا می توان راهی بهتر پیدا کرد؟
من تشکر می کنم.

Mani_rf
سه شنبه 08 مهر 1393, 16:31 عصر
این کار که شما بیای روی کامند ها لاگ بنویسی اصلا منطقی نیست. برای همین من این دوتا روش رو بهت پیشنهاد میکنم :

1- استفاده از فریم ورک هایی مثل Entity Framework و Nhibernate که این قابلیت ها رو بهت میدن.
2- استفاده از تریگر ها در SQL Server.

plus
سه شنبه 08 مهر 1393, 18:40 عصر
کلاس SqlCommand یک کلاس sealed هست یعنی اینکه نمیتونید ازش ارث بری کنید.میتونید از الگوی Factory استفاده کنید بجای اینکه هربار SqlCommand رو new کنید.البته با این روش هم مجبور خواهید بود همه new SqlCommand ها رو در پروژه Replace کنید.
فرض کنید یک کلاس به اسم SqlEventLog دارین که عملیات Log کردن رو انجام میده.
static class SqlCommandFactory {
public static SqlCommand Create() {
return Create(null, null, null);
}
public static SqlCommand Create(string cmdText) {
return Create(cmdText, null, null);
}
public static SqlCommand Create(string cmdText, SqlConnection connection) {
return Create(cmdText, connection, null);
}
public static SqlCommand Create(string cmdText, SqlConnection connection, SqlTransaction transaction) {
SqlCommand command = new SqlCommand(cmdText, connection, transaction);
command.StatementCompleted += new StatementCompletedEventHandler(command_StatementCo mpleted);
}
private void command_StatementCompleted(object sender, StatementCompletedEventArgs e) {
SqlEventLog logger = new SqlEventLog();
logger.DoLog((SqlCommand)sender, e.RecordCount);
}
}

در این حالت باید new SqlCommand رو با SqlCommandFactory.Create جایگزین کنید.

esafb52
سه شنبه 08 مهر 1393, 20:42 عصر
کلاس SqlCommand یک کلاس sealed هست یعنی اینکه نمیتونید ازش ارث بری کنید.میتونید از الگوی Factory استفاده کنید بجای اینکه هربار SqlCommand رو new کنید.البته با این روش هم مجبور خواهید بود همه new SqlCommand ها رو در پروژه Replace کنید.
فرض کنید یک کلاس به اسم SqlEventLog دارین که عملیات Log کردن رو انجام میده.
static class SqlCommandFactory {
public static SqlCommand Create() {
return Create(null, null, null);
}
public static SqlCommand Create(string cmdText) {
return Create(cmdText, null, null);
}
public static SqlCommand Create(string cmdText, SqlConnection connection) {
return Create(cmdText, connection, null);
}
public static SqlCommand Create(string cmdText, SqlConnection connection, SqlTransaction transaction) {
SqlCommand command = new SqlCommand(cmdText, connection, transaction);
command.StatementCompleted += new StatementCompletedEventHandler(command_StatementCo mpleted);
}
private void command_StatementCompleted(object sender, StatementCompletedEventArgs e) {
SqlEventLog logger = new SqlEventLog();
logger.DoLog((SqlCommand)sender, e.RecordCount);
}
}

در این حالت باید new SqlCommand رو با SqlCommandFactory.Create جایگزین کنید. خوشم میاد عاشق الگوهای طراحی هستی تو تمام پست هاتون جوابتون رو با یکی ز این الگو ها میگین

plus
سه شنبه 08 مهر 1393, 21:06 عصر
خوشم میاد عاشق الگوهای طراحی هستی تو تمام پست هاتون جوابتون رو با یکی ز این الگو ها میگین
لطف دارین.به هر حال این الگوها ابزاری طراحی نرم افزار هستن و شناخت و استفاده درست از اونها میتونه به طراحی بهتر خیلی کمک کنه.

fotrosi
چهارشنبه 09 مهر 1393, 09:17 صبح
این کار که شما بیای روی کامند ها لاگ بنویسی اصلا منطقی نیست. برای همین من این دوتا روش رو بهت پیشنهاد میکنم :

1- استفاده از فریم ورک هایی مثل Entity Framework و Nhibernate که این قابلیت ها رو بهت میدن.
2- استفاده از تریگر ها در SQL Server.

ضمن تشکر بابت وقتی که گذاشتی دوست عزیز، پروژه قبلا نوشته شده و مال زمانی های خیلی قبل است و تبدیل اون به ORM فعلا برام مقدور نیست. برای استفاده از تریگر که خودمم خیلی بهش علاقه دارم مشکل اینه که کد کاربر جاری و آدرس صفحه ای که دستورات اعمال می شه و همچنین دستورات Select رو نمی تونم توش مشخص کنم. با اینحال بسیار سپاسگذارم.