سلام دوستای خوبم
یک سیستم برخط باید طراحی بشه که به صورت لحظه ای هر تغییری که توی دیتابیس رخ می ده رو به کاربر نشون بده و شامل چهار حالته
یکی از روش های ساده استفاده از نخ و while(true) که همه می دونن کار خیلی هزینه بری... خودم امتحان کردم usage cpu تو سیستم من cpu i7 حدود 85 درصد شد!!!!
یکی دیگه از روشها استفاده از کلاس SqlDependency بعد از کلی اینور اونور زدن به نمونه کد زیر رسیدم
private string cnnstring = "connectionSTR";
private void dep_onchanged(object sender, SqlNotificationEventArgs e)
{
SqlDependency dep = (SqlDependency)sender;
dep.OnChange -= dep_onchanged;
}
DataTable selectdt()
{
SqlDependency.Stop(cnnstring);
SqlDependency.Start(cnnstring);
string command = "select name from student where id='0'";
SqlConnection con = new SqlConnection(cnnstring);
SqlCommand com = new SqlCommand(command, con);
com.Notification = null;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = com;
SqlDependency dep = new SqlDependency(com);
dep.OnChange += dep_onchanged;
con.Open();
da.Fill(dt);
con.Close();
return dt;
}
private void buttonX1_Click(object sender, EventArgs e)
{
selectdt();
}
البته این کار الزاماتی داره که باید سمت SQl انجام بشه اینم کوئری مورد نظر
alter database mydb set enable_Broker
create queue changed_queue
create service changed_srv on queue changed_queue('http://schemas.microsoft.com/sql/notifications/postquerynotification');
grant SUBSCRIBE query notifications to myLoginuser
خوب اشتباه نکنید.... آموزش نیست!!!!!!
سوالای من:
تو بحث sql به دومورد بر خوردم
الف) دستور alter database mydb set enable_Broker خیلی طول کشید و اصلا اجرا نشد به جاش اینو بکار بردم
alter database mydb set enable_broker with rollback immediate;
ب) تو این دستور هم
create service changed_srv on queue changed_queue('http://schemas.microsoft.com/sql/notifications/postquerynotification');
خطای دسترسی به آدرس رو میداد که من حذفش کردم
create service changed_srv on queue changed_queue;
تا اینجا آیا این دوتا کار خللی به روند اجرای کلاس SqlDependency وارد نمی کنه؟؟
ثانیا بر فرض خللی ایجاد نشد... چکار کنیم که آنلاین تشخیص بده... تو یه نمونه کد استخراج اطلاعات رو گذاشته بود تو یه دکمه در صورتی که تو برنامه من قراره سرور دیتابیس رو تغییر بده کلاینت ها متوجه بش
ثالثا آیا روش یا متد کلاس یا هرچیز دیگه ای که بهتر عمل کنه می شناسید؟؟
ببخشید طولانی شد!!
خیلی درگیر این مساله هستم... برنامه تموم شده و تو مقیاس آزمایشگاهی تست شده... ولی این مساله(استفاده از حلقه بی نهایت و نخ) هزینه بره برای سیستم های مقصد