PDA

View Full Version : باز و بسته کردن connection به پایگاه داده در timer



shirin_h
سه شنبه 04 دی 1386, 10:26 صبح
سلام
من تو برنامم مجبورم یه قسمت از کدم رو تو timer بنویسم تا بر اساس مقادیر انتخابی کاربر از combobox اطلاعاتی از پایگاه دادم بررسی شه
کدی که تو timer نوشتم شامل connection.open و connection.close هستش و به خوبی اجرا می شه می خواستم بدونم مشکلی پیش نمی یاد اگه همش connection رو باز و بسته کنیم و یا اینکه راهی هست که connection در بیرون timer باز بمونه و فقط تو timer بقیه کدم رو بنویسم؟

سار
سه شنبه 04 دی 1386, 10:39 صبح
ممکنه باعث خطای Connection Pooling بشه.
http://www.google.com/search?sourceid=navclient&ie=UTF-8&rlz=1T4GGLJ_en___IR249&q=Connection+Pool

shirin_h
سه شنبه 04 دی 1386, 11:33 صبح
راه دیگه ای وجود نداره که مجبور به این کار نشم؟

سار
سه شنبه 04 دی 1386, 11:51 صبح
بهتر دقیقن توضیح بدید که قصد انجام چه کاری رو دارید تا شاید روش بهتر رو بشه پیشنهاد کرد.

shirin_h
سه شنبه 04 دی 1386, 12:17 عصر
ok
ببینید من 2 تا combobox دارم که اطلاعاتی(نام و نام خانوادگی ) از db رو توسط dataveiwmanager بهش bind کردم
و 4 تا ستون تاریخ چک اول دوم سوم چهارم دارم
با استفاده از datareader این 4 تا تاریخ رو می خونم هرکدوم از تاریخ ها که برابر تاریخ مد نظر بود مبلغ چک اون تاریخ تو یه textbox نمایش داده می شه
وتمامی این کارها در مورد هر نام و نام خانوادگی که کاربر انتخاب کنه صورت می گیره برا همین از timer استفاده کردم
ok؟
کدمم می زارم


privatevoid timer1_Tick(object sender, EventArgs e)
{
try
{
conn = newSqlConnection(constr);
conn.Open();
}
catch (SqlException ex)
{
MessageBox.Show("Error in connection ..." + ex.Message);
}
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
dt = DateTime.Today.AddDays(1);
pc.GetYear(dt);
pc.GetMonth(dt);
pc.GetDayOfMonth(dt);
string sh = pc.GetYear(dt).ToString() + '/' + pc.GetMonth(dt).ToString() + '/' + pc.GetDayOfMonth(dt).ToString();
comtxt = "SELECT * FROM student WHERE (" +
"تاریخ_چک_اول='" + sh + "' or تاریخ_چک_دوم='" + sh + "' or تاریخ_چک_سوم='" + sh + "'or تاریخ_چک_چهارم='" + sh + "'" +
")";
comm = newSqlCommand(comtxt, conn);
dr = comm.ExecuteReader();
int f = dr.GetOrdinal("نام");
int l = dr.GetOrdinal("نام_خانوادگی");
int d1 = dr.GetOrdinal("تاریخ_چک_اول");
int m1 = dr.GetOrdinal("مبلغ_چک_اول");
int d2 = dr.GetOrdinal("تاریخ_چک_دوم");
int m2 = dr.GetOrdinal("مبلغ_چک_دوم");
int d3 = dr.GetOrdinal("تاریخ_چک_سوم");
int m3 = dr.GetOrdinal("مبلغ_چک_سوم");
int d4 = dr.GetOrdinal("تاریخ_چک_چهارم");
int m4 = dr.GetOrdinal("مبلغ_چک_چهارم");
while (dr.Read())
{
if (comboBox1.SelectedValue.ToString() == dr.GetString(f) && comboBox2.SelectedValue.ToString() == dr.GetString(l))
{
if (string.Compare(dr.GetString(d1).Trim(), sh.Trim()) == 0)
{
if (dr.IsDBNull(m1))
textBox1.Text = "";
else
textBox1.Text = dr.GetDecimal(m1).ToString();

}
else
{
if (string.Compare(dr.GetString(d2).Trim(), sh.Trim()) == 0)
{
if (dr.IsDBNull(m2))
textBox1.Text = "";
else
textBox1.Text = dr.GetDecimal(m2).ToString();
}
else
{
if (string.Compare(dr.GetString(d3).Trim(), sh.Trim()) == 0)
{
if (dr.IsDBNull(m3))
textBox1.Text = "";
else
textBox1.Text = dr.GetDecimal(m3).ToString();
}
elseif (string.Compare(dr.GetString(d4).Trim(), sh.Trim()) == 0)
{
if (dr.IsDBNull(m4))
textBox1.Text = "";
else
textBox1.Text = dr.GetDecimal(m4).ToString();
}
}
}
}
}
this.conn.Close();
}

سار
سه شنبه 04 دی 1386, 13:13 عصر
ok
ببینید من 2 تا combobox دارم که اطلاعاتی(نام و نام خانوادگی ) از db رو توسط dataveiwmanager بهش bind کردم
و 4 تا ستون تاریخ چک اول دوم سوم چهارم دارم
با استفاده از datareader این 4 تا تاریخ رو می خونم هرکدوم از تاریخ ها که برابر تاریخ مد نظر بود مبلغ چک اون تاریخ تو یه textbox نمایش داده می شه
و تمامی این کارها در مورد هر نام و نام خانوادگی که کاربر انتخاب کنه صورت می گیره برا همین از timer استفاده کردم
ok؟


اگر فقط قسمت Bold شده مهم هست، یعنی با تغییر نام شخص باید این کدها اجرا بشن نیازی به تایمر نیست.
نام ها در یک ComboBox قرار دارن و برای اینکه بفهمی آیتم انتخاب شده درون ComboBox تغییر کرده یا نه، میتونی از رخداد SelectedIndexChanged استفاده کنی.

sinpin
سه شنبه 04 دی 1386, 13:23 عصر
ok
ببینید من 2 تا combobox دارم که اطلاعاتی(نام و نام خانوادگی ) از db رو توسط dataveiwmanager بهش bind کردم
و 4 تا ستون تاریخ چک اول دوم سوم چهارم دارم
با استفاده از datareader این 4 تا تاریخ رو می خونم هرکدوم از تاریخ ها که برابر تاریخ مد نظر بود مبلغ چک اون تاریخ تو یه textbox نمایش داده می شه
وتمامی این کارها در مورد هر نام و نام خانوادگی که کاربر انتخاب کنه صورت می گیره برا همین از timer استفاده کردم
ok؟


راستش من که نفهمیدم چرا از تایمر استفاده میکنید وقتی که کاربر خودش نام رو انتخاب میکنه (مگه نمیتونید کد کاربر رو بطریقی پاس بدید و یا از ایونتهای مرتبط کنترلها استفاده کنید ؟)


ویرایش : " امان از این ریفرش نکردن(وقتی که پست میدید و بعد میبینید که یکنفر قبل از شما جواب داده و پست شما تبدیل به یک پست زائد میشه) "
ایکاش وقتی دکمه ویرایش رو کلیک میکردیم کل صفحه ریفرش میشد...

shirin_h
سه شنبه 04 دی 1386, 17:42 عصر
خوب دوست عزیز من اگه می دونستم میشه بدون استفاده از timer هم این کارارو کرد که دیگه استفاده نمی کردم.
ممنونم از این که این راه رو پیشنهاد کردید
و اینکه :خجالت:
این کدی که می نویسم error میده می دونم خیلی سوال سطح پایینی ولی میشه کمکم کنین


if (comboBox1.SelectedValueChanged )

من باید از SelectedValueChanged استفاده کنم چون کد مربوط به comboboxam اینجوریه


this.comboBox1.DataSource = this.dviewmanager;
this.comboBox1.ValueMember = "student.نام";

یه سوال دیگه هم داشتم اگه از همین selectedvaluechanged استفاده کنم سری اول که فرم اجرا میشه و هنوز کاربر چیزی رو انتخاب نکرده ولی اولین نام و نام خانوادگی تو combobox هستش چطور کدم رو بنویسم که همون سری اول هم اجرا شه.یعنی قبل از انتخاب کاربر؟
:خجالت:

sinpin
چهارشنبه 05 دی 1386, 09:36 صبح
http://barnamenevis.org/forum/showthread.php?t=89220