PDA

View Full Version : سوال: ارتباط با دیتابیس اکسس



elahe1393
دوشنبه 10 شهریور 1393, 09:23 صبح
سلام
فرمی به شکل زیر طراحی کردم که به دیتابیس اکسس دسترسی دارد
122939

کد برنامه هم مطابق با کد زیر است


private void btnNew_Click(object sender, EventArgs e)
{
bsPatients.AddNew();

txtCode.ReadOnly = false;
txtFirstName.ReadOnly = false;
txtLastName.ReadOnly = false;
txtAge.ReadOnly = false;
txtCodeMelli.ReadOnly = false;
txtTelephone.ReadOnly = false;
txtMobile.ReadOnly = false;
txtAddress.ReadOnly = false;
txtDescription.ReadOnly = false;

btnSave.Enabled = true;
btnCancel.Enabled = true;
btnNew.Enabled = false;
btnEdit.Enabled = false;
btnDelete.Enabled = false;

txtCode.Focus();
}

private void btnEdit_Click(object sender, EventArgs e)
{
txtCode.ReadOnly = false;
txtFirstName.ReadOnly = false;
txtLastName.ReadOnly = false;
txtAge.ReadOnly = false;
txtCodeMelli.ReadOnly = false;
txtTelephone.ReadOnly = false;
txtMobile.ReadOnly = false;
txtAddress.ReadOnly = false;
txtDescription.ReadOnly = false;

btnSave.Enabled = true;
btnCancel.Enabled = true;
btnNew.Enabled = false;
btnEdit.Enabled = false;
btnDelete.Enabled = false;

txtCode.Focus();
}

private void btnCancel_Click(object sender, EventArgs e)
{
bsPatients.CancelEdit();

txtCode.ReadOnly = true;
txtFirstName.ReadOnly = true;
txtLastName.ReadOnly = true;
txtAge.ReadOnly = true;
txtCodeMelli.ReadOnly = true;
txtTelephone.ReadOnly = true;
txtMobile.ReadOnly = true;
txtAddress.ReadOnly = true;
txtDescription.ReadOnly = true;

btnSave.Enabled = false;
btnCancel.Enabled = false;
btnNew.Enabled = true;
btnEdit.Enabled = true;
btnDelete.Enabled = true;
}

private void Patient_Information_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'dSPatient.Patients' table. You can move, or remove it, as needed.
this.taPatients.Fill(this.dsPatient.Patients);
}

private void btnDelete_Click(object sender, EventArgs e)
{
string firstName, lastName;
firstName = txtFirstName.Text;
lastName = txtLastName.Text;
FarsiMessagbox.Show(string.Format("می خواهید اطلاعات بیمار {0} را حذف نمایید؟ ", firstName + " " + lastName), "حذف اطلاعات بیمار", FMessageBoxButtons.OkCancel, FMessageBoxIcon.Question);
bsPatients.RemoveCurrent();
taPatients.Update(dsPatient.Patients);
FarsiMessagbox.Show(string.Format("اطلاعات بیمار {0} حذف گردید ", firstName + " " + firstName), "حذف اطلاعات بیمار", FMessageBoxButtons.OkCancel, FMessageBoxIcon.Information);
}

private void btnSave_Click(object sender, EventArgs e)
{
if (txtCode.Text == "")
FarsiMessagbox.Show("کد را وارد نمائید","",FMessageBoxButtons.Ok,FMessageBoxIcon.Error);
else
{
bsPatients.EndEdit();
taPatients.Update(dsPatient.Patients);
FarsiMessagbox.Show("اطلاعات شما با موفقیت ثبت شد", "", FMessageBoxButtons.Ok, FMessageBoxIcon.None);

txtCode.ReadOnly = true;
txtFirstName.ReadOnly = true;
txtLastName.ReadOnly = true;
txtAge.ReadOnly = true;
txtCodeMelli.ReadOnly = true;
txtTelephone.ReadOnly = true;
txtMobile.ReadOnly = true;
txtAddress.ReadOnly = true;
txtDescription.ReadOnly = true;

btnSave.Enabled = false;
btnCancel.Enabled = false;
btnNew.Enabled = true;
btnEdit.Enabled = true;
btnDelete.Enabled = true;
}
}

private void txtCodeSearch_TextChanged(object sender, EventArgs e)
{
taPatients.FillByCode(dsPatient.Patients, int.Parse(txtCodeSearch.Text));

}

private void txtLastNameSearch_TextChanged(object sender, EventArgs e)
{
taPatients.FillByLastName(dsPatient.Patients, txtLastNameSearch.Text);

}



حالا مشکل من
1. در هر اجرا وقتی بیمارانی اضافه می کنم و در دیتابیس اکسس ذخیره میشه وقتی برنامه رو می بندم بعضی وقتا کل دیتاها حذف میشه دلیلش چیه؟
2. می خوام وقتی کد و نام خانوادگی بیماری رو تو تکس باکسهای سمت چپ وارد می کنم یه جستجو بکنه و مشابه رو تو گرید ویو نشون بده یه کوئری مطابق با
SELECT Code, FirstName, LastName
FROM Patients
WHERE (Code LIKE '@code%')
برای FillByCode نوشتم و همینطور یه کوئری دیگه هم برای FillByLastName ولی وقتی متن داخل تکس باکسهای سمت چپ تغییر میکنه کل رکوردهای داخل گریدویو پاک میشه و هیچ عکس العمل مناسبی نداره مشکل کجاست؟

luckyboy77
دوشنبه 10 شهریور 1393, 10:16 صبح
سلام
در مورد اول چیزی به ذهنم نمیرسه
اما در مورد جستجویی که خواستین بهترین روش استفاده از خاصیت Filter در شی BindingSource هستش همراه با عملگر Like. به راحتی می تونی با And و Or هر ترکیب که خواستی فیلتر کنی (در حقیقت جستجو کنی)
من خودم تو برنامه هام استفاده میکنم و خوب جواب میده.

elahe1393
دوشنبه 10 شهریور 1393, 10:20 صبح
سلام
در مورد اول چیزی به ذهنم نمیرسه
اما در مورد جستجویی که خواستین بهترین روش استفاده از خاصیت Filter در شی BindingSource هستش همراه با عملگر Like. به راحتی می تونی با And و Or هر ترکیب که خواستی فیلتر کنی (در حقیقت جستجو کنی)
من خودم تو برنامه هام استفاده میکنم و خوب جواب میده.

درسته منم قبلا تو یه برنامه دیگه از همین روش استفاده کردم جواب گرفتم ولی دیتابیسم SQL بود ولی الان جواب نمیگیرم دیتابیسم اکسس هست نمیدونم تو کوئری مشکل هست اینو تو data set که ساختم تو بخش table adaptor این تابع رو با این کوئری ساختم که از فیلتر هم استفاده کردم ولی جواب نمیگیرم

elahe1393
دوشنبه 10 شهریور 1393, 10:44 صبح
الان که چک می کنم دیتابیسم پر هست وقتی data set برنامه با دیتابیس ارتباط برقرار می کنه دیتابیس رو خالی میکنه وقتی هم که از طریق برنامه رکورد به دیتابیس اضافه می کنم وقتی برنامه رو می بندم table تو data set خالی از دیتاست و وقتی می خوام کوئری بنویسم اجراش که می کنم اصلا دتایی نیست که بخواد برگردونه نمی دونم چطوری هی دیتاهای دیتابیس رو خالی میکنه لطفا راهنمایی کنید

alibilgats
دوشنبه 10 شهریور 1393, 11:02 صبح
دوست عزیز دلیل اینکه شما وقتی برنامه رو میبندی و دوباره باز میکنی اطلاعات پاک میشه به خاطر اینه که دیتابیس شما بصورت لوکال کپی میشه!
یعنی شما وقتی اجرا میکنی و اطلاعات رو وارد میکنی در واقع داری روی دیتابیس کپی وارد میکنی! وقتی هم که می بندی و دوباره اجرا میکنی یه کپی خالی روی قبلی دوباره کپی میشه!
باید دیتابیست رو از حالت کپی خارج کنی!

elahe1393
دوشنبه 10 شهریور 1393, 11:10 صبح
دوست عزیز دلیل اینکه شما وقتی برنامه رو میبندی و دوباره باز میکنی اطلاعات پاک میشه به خاطر اینه که دیتابیس شما بصورت لوکال کپی میشه!
یعنی شما وقتی اجرا میکنی و اطلاعات رو وارد میکنی در واقع داری روی دیتابیس کپی وارد میکنی! وقتی هم که می بندی و دوباره اجرا میکنی یه کپی خالی روی قبلی دوباره کپی میشه!
باید دیتابیست رو از حالت کپی خارج کنی!

دیتابیسم اکسس هست چطور باید از حالت کپی خارج کنم؟

alibilgats
دوشنبه 10 شهریور 1393, 11:10 صبح
در مورد جستجو هم باید بگم که به نظر من درست نیست که اینطوری کد رو توی TextChange بنویسی! یه button برای هر کدوم بذار و توی رویداد keypress براشون Enter رو معرفی کن تا هر وقت طرف متن رو وارد کرد و اینتر رو زد جستجو انجام بشه.
برای روش جستجو هم نظر دوست خوبم
luckyboy77 (http://barnamenevis.org/member.php?242350-luckyboy77)
بهتر از این روشیه که شما اعمال کردی! البته روش های دیگه ای هم هست که شاید بهتر باشه.

alibilgats
دوشنبه 10 شهریور 1393, 11:17 صبح
اگر موقعی که میخواستین دیتاسورس رو به پروژه اضافه کنید دقت میکردین خودش سوال میکنه که آیا حالت کپی بذارم یا نه!
واسه اینکار از قسمت Solution Explorer یا همون جایی که فرم ها و بقیه مخلفات پروژه هستن ایکون دیتابیست رو انتخاب کن و از قسمت properties گزینه Copy To Output Directory رو برابر با Do Not Copy قرار بده!

elahe1393
دوشنبه 10 شهریور 1393, 11:27 صبح
اگر موقعی که میخواستین دیتاسورس رو به پروژه اضافه کنید دقت میکردین خودش سوال میکنه که آیا حالت کپی بذارم یا نه!
واسه اینکار از قسمت Solution Explorer یا همون جایی که فرم ها و بقیه مخلفات پروژه هستن ایکون دیتابیست رو انتخاب کن و از قسمت properties گزینه Copy To Output Directory رو برابر با Do Not Copy قرار بده!

مرسی مشکل پاک شدن دیتابیس حل شد با تشکر

elahe1393
دوشنبه 10 شهریور 1393, 14:11 عصر
برای جستجو یک دکمه جستجو قرار دادم و در رویداد کلیک تابع زیر را نوشتم ولی گرید ویو خالی نشون داده میشه
private void btnSearch_Click(object sender, EventArgs e)
{
string code = txtCodeSearch.Text;
string lastName = txtLastNameSearch.Text;
if (code == "" && lastName == "")
{
FarsiMessagbox.Show("کد یا نام خانوادگی بیمار را وارد نمایید", "جستجو", FMessageBoxButtons.Ok, FMessageBoxIcon.Information);
}
else
{
if (code != "" && lastName != "")
{
this.taPatients.FillByCodeAndLastName(this.dsPatie nt.Patients, int.Parse(code), lastName);
}
else if (code != "")
{
this.taPatients.FillByCode(this.dsPatient.Patients , int.Parse(code));
}
else
{
this.taPatients.FillByLastName(this.dsPatient.Pati ents, lastName);
}
}


}
مشکل چیه؟

alibilgats
دوشنبه 10 شهریور 1393, 15:05 عصر
یعنی حتی با فیلد کد هم جواب نمیده؟
نوع فیلدهات توی بانک چطوریه؟

elahe1393
دوشنبه 10 شهریور 1393, 15:15 عصر
نه جواب نمیده
تو دیتابیس اکسس نوع کد number و LastName هم text هستش نوع پارامتر کد رو Int32 و lastName رو string تو کوئری گرفتم نمونه مقدار کد مثلا 1020 هستش

alibilgats
دوشنبه 10 شهریور 1393, 15:51 عصر
برای فیلد کد چرا از like استفاده کردین! به جای like از = استفاده کنید در ضمن اگر فیلد کد از نوع number هستش دیگه نیازی به ' در دوطرف پارامتر نیست

اگر امکانش بود برنامتون رو بذارید تا بررسی کنم.