سلام
مي ميخواهم به محض اينكه كاربري تغييري در ديتابيس داد (مثلا يك رديف به يك جدول توسط يه كاربر اضافه شد) جدول براي تمام بازديد كنندگان بروز بشه (بدون رفرش كردن توسط خود كاربر)
اين موضوع رو سرچ كرم اما جواب خوبي پيدا نكردم
(با C# و 2005 sql)
سلام
مي ميخواهم به محض اينكه كاربري تغييري در ديتابيس داد (مثلا يك رديف به يك جدول توسط يه كاربر اضافه شد) جدول براي تمام بازديد كنندگان بروز بشه (بدون رفرش كردن توسط خود كاربر)
اين موضوع رو سرچ كرم اما جواب خوبي پيدا نكردم
(با C# و 2005 sql)
باید یه Select بزنید.
شما وقتی به بانک اطلاعاتی اتصال برقرار کردید و رکورد مورد نظرتون را وارد کردید اطلاعات توی بانک اطلاعاتی وارد میشه و این یعنی اینکه اطلاعات تو بانک وجود داره و شما و هر کس دیگه می تونید اطلاعات به روز را ببینند
لطفا واضح تر توضيح بدين
اگه با يه مثال بگين ممنون ميشم
چون واقعا اينو لازم دارم
درسته اطلاعات در بانك ذخيره ميشه اما نياز به execute در بانك داريم وقتي برنامه در حال اجراست. اينكارو چطور بايد انجام بدم ؟
در غير اينصورت بايد از برنامه خارج بشم و بعد از ورود دوباره به برنامه تغييرات رو ببينم.
لطفا راهنمايي كنين
اينو امتحان كن
//**************************Refresh grid view****************************
SqlConnection connection2 = newSqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\Database.mdf;Integrated Security=True;User Instance=True");
string query1 = "select * from table1 ";
SqlCommand com1 = newSqlCommand(query1, connection2);
SqlDataAdapter adapter1 = newSqlDataAdapter(com1);
DataSet data1 = newDataSet();
adapter1.Fill(data1);
GridView2.DataSource = data1;
GridView2.DataBind();
یه تابع بساز با هر نامی که خواستی و توش کدهای نمایش رو بنویس Select .و بعدش بعد از اضافه کردن رکوردآخرش تابع رو فراخوانی کن.
كسي نميتونه با يه نمونه كد راهنماييم كنه
چون واقعا لازمش دارم
ممنون ميشم
البته این کد واسه آپدیته یکمی تغییرش بدی اضافه کردن رو مینویسی.
private void buttonX1_Click(object sender, EventArgs e)
{
int d = Convert.ToInt32(d1);
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "Provider = Microsoft.Jet.Oledb.4.0;Data Source=" + Environment.CurrentDirectory + "\\SuperMarket.Mdb";
Ssql = "Update Customer Set FirstName='" + textBox2.Text + "',LastName='" + textBox3.Text + "',Email='" + textBox4.Text + "',HomePhone=" + textBox5.Text + ",MobilePhone=" + textBox6.Text + ",Address='" + textBox7.Text + "',ZIPPostalCode=" + textBox8.Text + " Where id=" + d1 + "";
OleDbDataAdapter da = new OleDbDataAdapter(Ssql,con);
OleDbCommand cmupdate = new OleDbCommand(Ssql,con);
con.Open();
cmupdate.ExecuteNonQuery();
con.Close();
DataSet ds = new DataSet();
da.Fill(ds, "Customer");
show();
}
اینم تابع شو واسه بروز رسانی Gride View
private void show()
{
try
{
dataGridView1.DataBindings.Clear();
OleDbConnection Con = new OleDbConnection();
Con.ConnectionString = "Provider = Microsoft.Jet.Oledb.4.0;Data Source=" + Environment.CurrentDirectory + "\\SuperMarket.Mdb";
Con.Open();
Ssql = "Select * From Customer";
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(Ssql, Con);
da.Fill(ds, "Customer");
dataGridView1.DataBindings.Add(new Binding("DataSource", ds, "Customer"));
Con.Close();
}
catch { }
}
ممنون از راهنمايي شما دوست عزيز
اما من در يكي از صفحات فرم در بانك يك فيلد رو اضافه مي كنم و در فرم ديگر همين فيلد رو از Combo box مي خونم
اما مشكل اينجاست كه وقتي برنامه در حال اجراست و من اين فيلد رو اضافه مي كنم و همون موقع فرمي كه combo در اون قرار داره رو باز مي كنم اين فيلد اضافه نميشه و بايد از برنامه خارج شم و دوباره وارد شم
چطور اين مشكلو حل كنم؟چطور بانك رو در حال اجرا execute ميشه كرد؟
اگه ممكنه(با C# , sql 2005)
سلام دوست عزیز
منم همین مشکل رو داشتم
وقتی رو فرم دو بار کلیک می کنی تابع مربوط به form load باز می شه اونجا باید یه تیکه کد مثل زیر ببینی
this.callsTableAdapter.Fill(this.phbookDataSet1.ca lls);
اونو کپی کن و هر جا خواستی datagridview رو refresh کنی این کد رو بنویس
موفق باشی
قابلیت انجام اینکار در شبکه و برایه بیشتر از یک کاربر کار پیچیدهای است ، روش سادهای که با کد بشه پیشنهاد داد وجود ندارد، و در عمل هم معمولاً پیادهریزی نمیشه (حتی سیستم ERP مال مایکراسافت این قابلیت را نداره، کاربر دیگر قبل از ویرایش داده هایی که توسط یک کاربر دیگر در مابین زمان گرفته شدن و اراعه دادن ویرایشاتش باید رکورد را دوباره از داتابیس بگیرد.).
به جایه حل این مشکل به مبحث pessimistic / oprimistic locking نگاه برایه جلوگیری از تغییر دادهها به توسط یک کاربر دیگر بندازید.
combo box به بانك اتصال داره و فيلد مثلا نام رو نشون ميده
اما وقتي در فرم نام جديد وارد مي كنم و به فرمي كه combo اونجاست ميرم نام اضافه نشده
و بايد حتما از برنامه خارج شم و بعد از ورود دوباره تغييرات رو ببينم
واسه رفعش چيكار كنم؟
در فرمي كه كمبو در اونجا قرار داره در فرم لود اين كد رو نوشتم و كمبو رو به بانك اتصال دادم
string cnStr = "Data Source=.\\sqlexpress;Initial Catalog=SMSDB;Integrated Security=True";
SqlConnection obj = new SqlConnection();
obj.ConnectionString = cnStr;
DataSet ds = new DataSet();
SqlDataAdapter dp = new SqlDataAdapter();
dp.SelectCommand = new SqlCommand();
dp.SelectCommand.Connection = obj;
dp.SelectCommand.CommandText = "SELECT TypeName FROM Type";
obj.Open();
dp.Fill(ds, "Type");
obj.Close();
CmbTypeS.DataSource = ds;
CmbTypeS.DisplayMember = "Type.TypeName";
در فرم ورود هم كه اطلاعات رو وارد كردم از جمله اين فيلدي كه در كمبو select كردم
اما وقتي در زمان اجرا فيلد رو وارد مي كنم در كمبوي اين فرم نشون نميده
بنا بر این چیزی که میگید، اگر فرمی که کمبو باکس داخلش هست را ببندید و باز کنید ( یا اینکه بعد از اینکه مقادیر به داتابیس وارد شد بازش کنید) باید مقادیر وارد شده رو هم نشان بده.
از روشهایی مانند استاتیک برایه نشان دادن فرم استفاده میکنید؟ کدی که فرمی که کمبو باکس داخلش قرار دارد را برایه نشان دادن استفاده میکنید را بفرستید.
سلام
میتونی از تایمر استفاده کنی
ميشه بيشتر توضيح بدين؟
ممنون ميشم
آخه خيلي از برنامه ها اين حالت رو دارن اما چرا هيچ جوابي واسه اين مشكل كسي نميده!
میشه.
من این کار رو انجام دادم.بیشتر از 6 ماه روش کار کردم.و سرعت و دقت فوق العاده ای داره.(استفاده ازUser Defined Transaction)
و باید بگم که متاسفانه اگر کدش(+30MB) رو بهتون بدم نمیتونید استفاده کنید چون با دیتاست طراحی نشده و زیادی OO هست. و قابلیت نوشتن کد hacky(عشق بچه های تالار) رو نداره.
فقط خواستم بگم که میشه ولی خیلی سخته.
من برای هر جدول از 5 تا class و کلی Interface استفاده میکنم.(که حداقل تعداد ممکن برای این کار هست.حداکثر هم نداره.)
به طور مثال
CustomerRow//برای ذخیره اطلاعات client-only
CustomerHost//برای اجرا دستورات در سرور server-only
CustomerEditEventArgs//برای تبادل اطلاعات shared
CustomerDeleteEventArgs//برای تبادل اطلاعات shared
CustomerInsertEventArgs//برای تبادل اطلاعات shared
فقط یک وقت نوشتنش به صورت دستی توی ذهنتون جرقه نزنه(من از روز اول یک code-generator طراحی کردم و 6 ماه طول کشید.و برای من هر تیبل با 5 تا فیلد~=5000خط کد)
اگر میخواهید چنین چیزی طراحی کنید به این چند تا requirement دقت کنید:
کد اس کیو ال Support کنه*
یک به یک - یک به n - n به n رو Support کنه**
سریع باشه.
بتونه Cloud باشه
cross-database باشه*
نیاز به Client-Configuration نداشته باشه*
تحت وب کار کنه.
ترافیکش پایین باشه.
سطح دسترسی داشته باشه.
log داشته باشه.
رمزگزاری های Public-Key/Private-Key رو ساپورت کنه.*
قابلیت داشتن Integrated BLL با استفاده از کلاسهای partial متود های partial اینترفیس ها و ...**
...
ستاره دار ها مهم هستند.
من فقط همین ها رو میدونم(http://en.wikipedia.org/wiki/Phosphorus تموم کردم.)
من اسمش رو گزاشتم:RealTime Server-Side DAL
هنوز اسمش رو ثبت نکردم.(چی گفتم توی ایران مهد کپیرایت)
ببخشید اگر طولانی شد و یا خیلی تعریف از خود بود.
معذرت میخوام.
"این مشکل" معنی نمیده، کدام مشکل؟
کدی که برایه پر کردن کمبو باکس فرستاده بودید از لحاض کاری اشکلای ندارد (ولی میشه از اینی که هست خیلی بهتر باشد)، ولی "مشکل" اصلی شما به نظر میرسد اینه که کی این کد صدا زده میشه.
همانطوری که در پست قبلی گفتم، بنابر کدی که فرستادید هر بار که فرم باز میشه، باید جدیدترین مقادیر را نشان بده.
پس تنها چیزی که میماند اینه که این کد کی صدا زده میشه، برایه جواب به این "مشکل" باید اینکه فرم را چطوری لود میکنید را ببینید.
یا هم هر بار که کمبو باکس دروپداون میشه پاکش کنید و دوباره از داتابیس پرش کنید.
من اين كد رو در لود فرم نوشتم و فرم ورود روي اين فرم باز ميشه و وقتي فرم ورود رو ميبندم در كمبو مقادير اضافه شده رو نشون نميده واسه همين كد رو در event هاي مختلف كمبو هم امتحان كردم اما جواب نداد بايد يه بار فرم كمبو رو ببندم و دوباره باز كنم اما خوب اينجوري كه اصلا جالب نيست!
من با توضیحاتتان بیشتر گیج شدم،
اگر ممکن است این ۲ تا فرم را بفرستید، یا هم اینکه اگر پروژه کوچیک است بفرستید، احتیاجی به فرستادن داتابیس نیست، فقط کد را ببینیم بسه.
از لحاظ منطقی ، اگر فرم را دیباگ کنید باید ببینید که متد زمان لودشدن هر بار که فرم باز میشه باید کال بشه (به شرط اینکه از ورشهایی مانند مخفی کردن و دوباره نشان دادن فرم استفاده نشده باشد).
سلام به همه دوستان
دوستان من فهميدم مشكل اين دوستمون چيه!! دوست عزيز كساني كه تا به اينجا جوابهايي رو به شما دادند همه از اساتيد اين سايت هستند ولي به دليل كامل نبودن توضيحات شما متوجه قضيه نشدند!
از لحاظ منطقی ، اگر فرم را دیباگ کنید باید ببینید که متد زمان لودشدن هر بار که فرم باز میشه باید کال بشه (به شرط اینکه از ورشهایی مانند مخفی کردن و دوباره نشان دادن فرم استفاده نشده باشد).
البته استاد آرژنگ اشاره فرمودند!
اما حل مشكل شما دوست عزيز...
ببين وقتي يه كدي در فرم لود قرار بگيره زماني كه فرم برا اولين بار باز بشه اجرا ميشه و يا اگه فرم close بشه و باز بشه اجرا ميشه!! ولي چون شما در هنگام باز بودن فرم يه فرم ديگه باز مي كنيد و اونو مي بنديد ديگه كد رويه فرم لود اجرا نميشه و نتيجه ميشه مشكل شما!! حال شما كد رويه فرم لود رو در رويداد form Activate كپي كن حتما مشكلتون حل ميشه!!
موفق باشيد
سلام ممنون
اما اين مشكل حل نشد
واسه بهتر مشخص شدن اين مشكل من كد فرم رو ميذارم اما چون پروژه حجمش بالاست من فقط اين دو صفحه كه مشكل داشت و كد اون رو گذاشتم بدون ديتابيس
كد كمبو در فرم لود هست اما من كدشو همون طور كه دوست عزيز گفتن در Form_Activated هم امتحان كردم جواب نداد در event هاي كمبو هم امتحان كردم اما متاسفانه ....
ممنون ميشم راهنمايي كنين
همين مشكل رو در مورد ديتا گريد هم دارم
WindowsFormsApplication1.zip
برایه بهبود برنامه به این نکات توجه کنید:
۱. به جایه کپی پیست این
string cnStr = "Data Source=.\\sqlexpress;Initial Catalog=SMSDB;Integrated Security=True";
از کانکشن استرینگ در کانفیگوریشن فایل استفاده کنید،
۲. این کد :
if (DB.dbConnected(cnStr))
{
DB myDB = new DB();
گنگ است ، کد کلاس را بفرستید.
این کد باید مرتب بشه وگرنه حتی اگر بتونیم به اندازه کافی کج و ماوجش کنیم که بنظر بیاد که کار میکنه در اصل فاجعه است.
روش ماسمالی: (این مشکلتان را در ظاهر حل میکنه ولی مشکلات اصلی همانطوری حل نشده میمانند):
این کد را
private void BtnNewTp_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
private void Form1_Load(object sender, EventArgs e)
{
string cnStr = "Data Source=.\\sqlexpress;Initial Catalog=SMSDB;Integrated Security=True";
SqlConnection obj = new SqlConnection();
obj.ConnectionString = cnStr;
DataSet ds = new DataSet();
SqlDataAdapter dp = new SqlDataAdapter();
dp.SelectCommand = new SqlCommand();
dp.SelectCommand.Connection = obj;
dp.SelectCommand.CommandText = "SELECT TypeName FROM Type";
obj.Open();
dp.Fill(ds, "Type");
obj.Close();
CmbTypeS.DataSource = ds;
CmbTypeS.DisplayMember = "Type.TypeName";
}
با این کد عوض کنید:
private void BtnNewTp_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
ConnectToDatabase();
}
private void Form1_Load(object sender, EventArgs e)
{
ConnectToDatabase();
}
private void ConnectToDatabase()
{
string cnStr = "Data Source=.\\sqlexpress;Initial Catalog=SMSDB;Integrated Security=True";
SqlConnection obj = new SqlConnection();
obj.ConnectionString = cnStr;
DataSet ds = new DataSet();
SqlDataAdapter dp = new SqlDataAdapter();
dp.SelectCommand = new SqlCommand();
dp.SelectCommand.Connection = obj;
dp.SelectCommand.CommandText = "SELECT TypeName FROM Type";
obj.Open();
dp.Fill(ds, "Type");
obj.Close();
CmbTypeS.DataSource = ds;
CmbTypeS.DisplayMember = "Type.TypeName";
}
سلام
اين كد مربوط به همون كلاس است.
من ميخوام اين كار بهينه باشه چه كار بايد بكنم؟
ممنون از كمكتون
DB_DLL.zip
من كد رو امتحان كردم تغييري ايجاد نشد
خواهش مي كنم يكي كمك كنه.آخه اين جور صفحات تو خيلي از برنامه هاي حسابداري هست واسه حلش پس چيكار ميكنن؟؟؟؟؟؟؟
۱. از اون کلاس استفاده نکنید! (اگر هم مجبورید که استفاده کنید لاقل یک کد را ۱۰ جایه مختلف کپی پیست نکنید، همان کانکشن استرینگ را در همان کلاس هارد کود میکردید بهتر بود)ولی حداقل با داتاست کار کنید،
مثال ساده ضمیمه شده: (این مثال از DatSet استفاده میکنه ، راههایه جدیدتر Entity Framwork, Linq To Sql ...را برایه کارهایه عملی توصیه میکنم ، این مثال فقط برایه اینه که حداقل پروژه از این سطح کمتر نباید باشد است)
مشکل منم این بود اما یه جا خوندم از query notification باید استفاده شه.
اما خودم نتونستم به کد تبدیلش کنم. وقتی کسی در جدول شما رکوردی اضافه می کنه sql به شما خبر میده و شما می تونی دوباره کمبوباکستو به صورت خودکار پر کنی.
با سلام خدمت اقای اَرژنگ
امیدوارم وقت جواب دادن رو داشته باشید.
من یک سوال داشتم اونم اینه که چطوری میشه در معماری 3 لایه ای برای دو جدول کار کرد.
اون چیزی که شما عرض کردید و واقعا من ازش استفاده کردم برای یک جدول بود.
من برای دو جدول میام در همین 3 لایه کار ها رو میکنم ولی یک جا خودنم کدجریتور ها میان مثلا برای 3 جدول 9 لایه درست میکنن تو همین سایت بود ؟؟!!! ولی چطور برای لایه کاربری 3 لایه جدا درست شده. اصلا قاطی شده.
کدام روش اصولی تر هستش
با تشکر
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»
اگر بخواهید به همین مثال یک جدول دیگر اضافه میکنیم که راحت معلوم باشد، یک جدول شماره تلفن اضافه کنیم که اشخاص به شماره تلفنها ربط داشته باشند به کار میاد؟
در معماری ۳ لایه تعداد جدولها مهم نیست، فقط در لایه دال اینکه از کدام جدولها گرفته و یا داده حفظ میشه اهمیت دارد، بقیه برنامه با اشیایه منطقی کار میکنند.
مثلاً میشه یک کلاس دانشآموز را از ۲ تا جدول خواند و در ۳ تا جدول ثبط کرد ولی از لایه دال به بالا فقط با کلاس دانش آموز کار میکنند.
اینکه کد جنریتورها بر تعداد جداول لایه درست میکنند درست نیست، ممکنه بر تعداد جدولها کلاس درست کرد و یا بر تعداد کلاسها جدول درست کرد و یا اینکه اصلاً میشه هیچ رابطهای بین تعداد کلاسها و یا جدولها نباشد. اینکه تعداد لایهها برحسب جدولها تغییر میکنه اصلاً منطقی نیست! ممکنه مفهومها را اشتباه درک کرده باشند.
اقا بهترین راه حل اینه که تو یه تایمر کد سلکت رو قرار بدی و تعداد رو تو یه لیبل مخفی بذاری. بعد تو رویداد تکست چینج لیبل بنویسی که آقا دیتا سورس گرید همون دیتا سته که آخرین بار توی تایمر ایجاد شد.
امیدوارم کودشو خودت بتونی بنویسی.
آقای mmd2009 از بابت این پست مفیدتون متشکرم
میخواستم بدونم آیا شما موفق شدید که در برنامتون از دو یا سه جدول به جای یه جدول استفاده کنید؟
مثالی که گذاشته بودین خیلی ساده و قابل فهم بود ، اگر بتونید اون مثال رو با دو یا سه جدول تکمیل و در اینجا قرار بدین یک دنیا ممنون میشم ازتون....
متشکرم
با سلام.
همونطور که دوستمون گفتن اصلا فرقی نداره 1 جدول باشه یا 100 تا.
متاسفانه کنکور دارم و چند وقته وقتمو صرف خوندن کتابهای جامع کردم و چون اصلا برنامه vs رو هم پاکش کردم و نمیتونم مثال اماده کنم تا بعد که انشاالله با توپ پر بیام تو سایت.
کسی که به خود اطمینان دارد به تعریف دیگران احتیاج ندارد. «گوستاو لوبون»