PDA

View Full Version : سوال: یک راهنمایی برای دستورات دیتابیس access



esmael_g
شنبه 23 مرداد 1395, 10:07 صبح
سلام دوستانم خسته نباشید من تو بخش دیتا بیست زیاد کار نکردم و می تونم بگم تازه واردم دارم رو یه برنامه کار می کنم اما خداییش خستم کرد تو برخی از قسمت ها اصلا جور در نمی یاد مثلا قسمت ویرایش رو می زنم اما تو دیتا گرید نشون نمی ده حتما باید برنامه رو ببندم و دوباره باز کنم_ این تابع رو برای نمایش محتوایی جدول نوشتم

void display()
{
OleDbConnection con1 = new OleDbConnection();
con1.ConnectionString = "مسیر دیتا بیست";
OleDbDataAdapter da = new OleDbDataAdapter("select * from atlaat", con1);
DataSet ds = new DataSet();
da.Fill(ds, "atlaat");
dataGridView1.DataSource = ds.Tables["atlaat"].DefaultView;
con1.Close();
}

نباید مشکلی داشته باشه

در اخر هر دستور هم display();رو می نویسم
حالا این بماند این زیاد منو ناراحت نمی کنه چیزی که داره دیونم میکنه اینه قسمت حذف برنامه با کمک یه کد ردیف مورد نظرم رو حذف می کنم خوب حذفم می شه بر خلاف بالایی لازمم نیست برنامه رو ببندم بعد حذف سریع حذف میشه تو خود پایگان دادم هم نگاه می کنم اون قسمت حذف شده یعنی درسته ولی وقتی برنامه رو دوباره اجرا می کنم اون تب دوباره بر می گرده انگار نه انگار پاکش کردم نمی دونم مشکل از کجاست اینم کد اون قسمت

OleDbConnection con = new OleDbConnection();
con.ConnectionString = "محل دیتا بیست";
OleDbCommand com = new OleDbCommand();
com.Connection = con;
int item;
com.CommandText = "select count(code_esh) from atlaat where code_esh='" + textBox1.Text + "'";
con.Open();
item=(int)com.ExecuteScalar();
con.Close();
if (item != 0)
{

com.CommandText = "delete from atlaat where code_esh='" + textBox1.Text + "'";
con.Open();
com.ExecuteNonQuery();
con.Close();
display();
}
else
MessageBox.Show("کد اشتراک صحیح نیست یا در سیستم تعریف نشده است","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}

خواهشا کمک کنید مشکلم چیه

esmael_g
شنبه 23 مرداد 1395, 18:27 عصر
کسی نبود یه راهنمایی بکنه؟ لطفا

esmael_g
شنبه 23 مرداد 1395, 18:41 عصر
دوستان کمک کنید اینم خود برنامه هر کاری می کنم جور نمیشه خودتون ببینید مشکل از کجاست لطفا :عصبانی++:
http://s2.picofile.com/file/8263631584/TelPhone.zip.html

mrprestige
شنبه 23 مرداد 1395, 18:48 عصر
سلام دوست من وقتت بخیر ، خب دوست من شما داخل تابع Display کانکشن رو open نکردید !!! اصلا بجای این تابع آخر دستورتتون بیاید این کد رو بنویسید ( در نظر میگیرم پروژه شما در Form1 هست )

Form1_Load(null,null);

در قسمت سوال دومتون میتونم بگم کدهاتون رو میتونستید بهینه تر بنویسید و اینکه منظورتون از اینکه فرمودید اون تب برمیگرده چیه ؟

esmael_g
شنبه 23 مرداد 1395, 19:04 عصر
ممنون از پاسختون خوب یه مشکل دیگه هم بر خوردم البته شاید این کارم اشتباه بود اما دیتا بیست قدیم رو پاک کردم و دوباره یکی دیگه با همون مشخصات دقیقا نوشتم یعنی با همون اسم تب های داخلی و اسم های داخلش در کل بدون تغییر تنها چیزی که حذف کردم ستوت IDبود اونو حذف کردم چون خودم یه ستون به اسم code_eshبهش دادم که با کمک اون کد اسامی رو حذف ویرایش و... می کردم اما حالا مشکل بوجود اومد که تو اون برنامه که اپلود کردم هست اولی صفحه اول ورود بدون مشکل می تونم با یوزر پس وارد شم صفحه دوم نمی تونم کد که خواستم رو جستجو کنم و تب مثلا اشتراک ها تو دیتا گرید اطلاعات دیتا بیست میاد اما نمی تونم حذف ویرایش کنم( می تونم اضافه کنم اما) قبلا درست بود اما چند مشکل بالا رو داشت اما الان مشکل شد اینا مسیر رو دوباره بهش دادم اما چاره ساز نبود بازم ممنون میشم نگاهی بندازید ( راستی این پروژه اینا نیست چون بحث دیتا بیست رو سخت می دیدم نمی خواستم زیاد روش کار کنم اما باید بلعخره دنبالش می کردم نمی شد که نرم

mrprestige
شنبه 23 مرداد 1395, 19:53 عصر
خب دوست من (بنده دسترسی به پایگاهتون ندارم برای همین اگه کدهای بنده خطا داد فکر نکنید اشتباه چون ذهنی نوشتم هموشون رو) توی این خط کدی که نوشتی

com.CommandText = "select * from atlaat where code='" + textBox1.Text + "'";

به صورت تغییرش بده

com.CommandText = "select * from atlaat where code=" +Convert.Toint32(Textbox1.text)+ "";




و دستور Update رو به این صورت بنویس (البته اصولی نیس ولی سعی کردم عین روش خودت باشه تا سردرگم نشی)

com.CommandText = "update atlaat set name='" + textBox3.Text + "', family='" + textBox4.Text + "',tel='" +
Convert.ToInt32(textBox5.Text) + "', code_esh=" + Convert.ToInt32(textBox6.Text) +
", addres='" + textBox7.Text + "'" + "where code_esh=" + Convert.ToInt32(textBox2.Text);


و در نهایت دستور حذف هم به این شکل

com.CommandText = "select count (code_esh) from atlaat where code_esh=" +Convert.ToInt32(textBox1.Text) + "";
con.Open();
item=(int)com.ExecuteScalar();
con.Close();
if (item != 0)
{

com.CommandText = "delete from atlaat where code_esh=" + Convert.ToInt32(textBox1.Text) + "";
con.Open();
com.ExecuteNonQuery();
con.Close();
Form3_Load(null,null);


دوست من یاد بگیرید از Datacommnad پارامتر دار استفاده کنید امنیت کدهاتون بالاتر میره . امیدوارم تونسته باشم کمک کرده باشم .

پیروز و موفق باشید

esmael_g
شنبه 23 مرداد 1395, 21:20 عصر
خیلی بزرگوارید که با این دقت جواب میدید واقعا ممنونم تمام فیلد ها درست شدن جز یکی اپدیت البته چند سوال دارم چون یه کوچولو گیج شدم تنها ستون های مانندtel و کد اشتراکی رو تبدیل می کنیم به انتیجر 32بیت؟ چون بقیه ندارن convert.toint32();
فقط این دو تا دارن و در آخر دو بار کد اشتراکی تکرار شده بار اول برای اپدیت بار دوم برای چی نوشتیم ؟ اگه برای مثال زمانی که رو تیکس باکس2 کد اشتراک رو می زنم تو تیکس باکس های مربوطه اطلاعات اون فرد رو میاره تغییر تو همون جا کافی نیست (لازمه حتما تیکس باکس 2 در آخر دوباره اسم برده بشه؟)

esmael_g
یک شنبه 24 مرداد 1395, 10:34 صبح
خوب خوشحالم مشکل اپدیت هم حل شد همون کد بالا رو استفاده کردم تنها یه اشتباه کوچیک توش داشتم ماشاءالله به این مبحث دیتا بیست :لبخند: راستی یه سوال که ممنون میشم جواب بدید
نحوه اتصال به دیتا بیست چند نمونه داریم
con.ConnectionString = "محل دیتا بیست";
مثلا این نمونه من مسیر دیتا بیست رو کامل میدی از درایو که توشه تا پوشه دیباگ برنامه یه راهی هست که جوری تعریف کرد برنامه هر مسیری هر پوشه ای و هرجایی از کامپیوتر باشه بشه جوری به دیتا بیست مسیر داد تو برنامه که وصل شه بازم الان اگه پوشه رو تغییر مسیر بدم دیگه اتصال ممکن نمی شه ممنون میشم بگید چجوری می شه

mrprestige
یک شنبه 24 مرداد 1395, 15:46 عصر
خیلی بزرگوارید که با این دقت جواب میدید واقعا ممنونم تمام فیلد ها درست شدن جز یکی اپدیت البته چند سوال دارم چون یه کوچولو گیج شدم تنها ستون های مانندtel و کد اشتراکی رو تبدیل می کنیم به انتیجر 32بیت؟ چون بقیه ندارن convert.toint32();
فقط این دو تا دارن و در آخر دو بار کد اشتراکی تکرار شده بار اول برای اپدیت بار دوم برای چی نوشتیم ؟ اگه برای مثال زمانی که رو تیکس باکس2 کد اشتراک رو می زنم تو تیکس باکس های مربوطه اطلاعات اون فرد رو میاره تغییر تو همون جا کافی نیست (لازمه حتما تیکس باکس 2 در آخر دوباره اسم برده بشه؟)
سلام دوست من وقتت بخیر و اینکه خواهش میکنم کاری نکردم هر کسی جای من بود همین کار رو میکرد و اینکه خوشحالم مشکل برطرف شد.
ستون هایی مثل tel و کد اشتراکی چون از نوع عددی هستند و از اونجایی که textbox مقدار از نوع رشته رو دریافت میکنه بنده براتون به نوعی textbox ها رو تبدیل کردم که وقتی شما عدد داخل اون وارد میکنید با خطا مواجه نشید . در قسمت دوم فرمایشاتتون هم عرض کنم شما وقتی از کوئری Update استفاده میکنید باید در آخر برای اون شرطی (Where) رو قرار بدید مثلا بنده توی اینجا نوشتم که اگه کد اشتراک برابر بود با مقداری که ما داخل textbox2 نوشتیم اونوقت این فیلدهارو برامون update کن و در قسمت آخر فرمایشتون عرض کنم که بله حتما باید textbox2 ذکر بشه تا برنامه بفهمه طبق چه شرطی داره عملیات بروزرسانی (update) رو انجام میده در کل بگم که باید از کنترل هایی که در ارتباط با پایگاه شما میتونن دخالت داشته باشن باید ذکر بشن .

mrprestige
یک شنبه 24 مرداد 1395, 16:13 عصر
خوب خوشحالم مشکل اپدیت هم حل شد همون کد بالا رو استفاده کردم تنها یه اشتباه کوچیک توش داشتم ماشاءالله به این مبحث دیتا بیست :لبخند: راستی یه سوال که ممنون میشم جواب بدید
نحوه اتصال به دیتا بیست چند نمونه داریم
con.ConnectionString = "محل دیتا بیست";
مثلا این نمونه من مسیر دیتا بیست رو کامل میدی از درایو که توشه تا پوشه دیباگ برنامه یه راهی هست که جوری تعریف کرد برنامه هر مسیری هر پوشه ای و هرجایی از کامپیوتر باشه بشه جوری به دیتا بیست مسیر داد تو برنامه که وصل شه بازم الان اگه پوشه رو تغییر مسیر بدم دیگه اتصال ممکن نمی شه ممنون میشم بگید چجوری می شه

خب مسلما انواع مختلفی برای نحوه اتصال وجود داره و اینکه همچین چیزی نیست که شما فابل پایگاه دادتون رو تو هر درایو و بطور کل آدرس دلخواهی نصب کنید ولی برنامه شما بیاد تشخیص بده که اون فایل کجاست و... برای همچین مسئله پیشنهادی که ارائه شده اینه که شما میتونید فایل پایگاهتون را دخل پوشه bin=>Debug پروژه تون بریزید و داخل برنامتون بجای اینکه بیاد از اون همه خط برای کانکشن استرینگتون استفاده کنید به این صورت بنویسید
یعنی این متن کانکشن استرینگ شما بود

con1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/esmaelgandomi/Documents/Visual Studio 2012/Projects/TelPhone/TelPhone/bin/Debug/Tel.mdb";

دیگه اینطوری مینویسید

con1.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|Tel.mdb";

دیگه از اون به بعد اگه خواستی پروژه ت هم میتونی روی یه سیستم دیگه اجرا کنی چون خیالت راحت باشه که فایل دیتابیس تون داخل پوشه پرژه تون هست
امیدوارم توسنته باشم کمکت کرده باشم دوست خوبم و امیدوارم ا کدنویسی لذت ببری .

esmael_g
یک شنبه 24 مرداد 1395, 23:33 عصر
خیلی ممنون ازتون بابت پاسخ احتمالا در سوال دوم اشتباه منظورم رو رسوندم( البته شما جواب رو دادید که همونی بود که خواستم) تو هر درایوی هر جایی نه منظورم اینه ،دیتا بیست تو پوشه برنامه bin=>Debug باشه و پوشه اصلی هر جایی بخواییم بزاریم بود که با این حال شما جواب دقیق رو به من دادید خیلی ممنون ازتون

esmael_g
سه شنبه 26 مرداد 1395, 09:56 صبح
سلام دوستان دوباره ببخشید این کد کجاش اشتباهه؟
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/esmaelgandomi/Documents/Visual Studio 2012/Projects/TelPhone/TelPhone/bin/Debug/Tel.mdb";
OleDbCommand com = new OleDbCommand();
com.CommandText = "update login set name='" + textBox3.Text + "', family='" + textBox4.Text + "', age='" + textBox5.Text + "', history='" + textBox6.Text + "', mili='" + textBox7.Text + "', tel='" + textBox8.Text + "', mobile='" + textBox9.Text + "', addres='" + textBox10.Text + "', pass='" + textBox11.Text + "', roz='" + comboBox1.Text + "', mah='" + comboBox2.Text + "', sal='" + comboBox3.Text + "', usar='" + textBox12.Text + "' where mili=" + textBox2.Text;
con.Open();
com.Connection = con;
com.ExecuteNonQuery();
con.Close();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
textBox6.Clear();
textBox7.Clear();
textBox8.Clear();
textBox9.Clear();
textBox10.Clear();
textBox11.Clear();
textBox12.Clear();
comboBox1.Text = null;
comboBox2.Text = null;
comboBox3.Text = null;
button4.Enabled = true;
display();


این ارور رو می گیره
Data type mismatch in criteria expression.
هر کاری کردم نشد راستی اون قسمت comboboxرو درست نوشتم .

esmael_g
سه شنبه 26 مرداد 1395, 13:17 عصر
حلش کردم ایول خخخخخخ

راه حل این بود (البته راه حلی که برای خودم پیش بردم) تو دیتا بیستم یه تب جدید ایجاد کردم اسمش رو idگذاشتم در نهاست بجایی miliاون بالا برای اپدیت کردن که مثلا کد ملی رو میدیم و اطلاعات رو اپدیت می کنیم idرو میدم و اطلاعات رو اپدیت می کنم

mrprestige
سه شنبه 26 مرداد 1395, 18:25 عصر
خوشحالم به نتیجه رسیدی دوست من ، این هم راه حل خوبیه ولی لازم نبود دیگه شما یه فیلد به اسم ID ایجاد کنی چون فیلد کد ملی تون همون کار رو میکرد به این خاطر بود که بنده هم توی Query شرط رو براساس فیلد کد ملی قرار دادم چون کد ملی عددیه که منحصر به فرد هست که اگه کد ملی تون برابر اون چیزی بود که در textbox2 نوشتید بود اونوقت عمل بروز رسانی رو انجام بده .. به هر حال امیدوارم موفق باشی و کدهای قوی تری رو بنویسی .

esmael_g
سه شنبه 26 مرداد 1395, 21:56 عصر
تو بخش بعدی برنامم که باز ار اپدیت استفاده کردم مشکل برنامه رو دیدم حالا نمی دونم بگم مشکل یا باید برنامه من اینجوری میشد تو دیتا بیست اکسس باید قسمتی مثل کد ملی رو تو حالت numberقرار می دادم بعد تو برنامم به انتیجر 32تبدیل می کردم در این صورت برنامه اجرا می شد تو قسمت بعدی برنامه باز ارور که بالا گفتم رو داد این کار رو کردم کلا حل شد یعنی برای اینکه ارور نده باید کد ملی رو تو دیتا بیست به number تغییر میدادم( منظورم از نامبر اسم نیست یعنی اون فیلد خاصیت عددی داشته باشه ) _ فقط تو قسمت اپدیت این مشکل بود تو برنامم 4بار از اپدیت استفاده کردم هر بار این مشکل بود در نهایت این راه حل رو پیدا کردم برای همشون