PDA

View Full Version : مشکل در کانشکن



مهدی رحیم زاده
چهارشنبه 11 بهمن 1385, 08:07 صبح
سلام
من یه کانکشن با بانک Access ایجاد کردم ، اینجوری :

str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\db1.mdb";
connect.ConnectionString = str;
connect.Open();
strcom = "select * from combo1";
OleDbDataAdapter da = new OleDbDataAdapter(strcom, str);
DataSet ds = new DataSet();
da.Fill(ds, "combo1");
حالا می خوام که به تک تک فیلد های table دسترسی داشته باشم ، اما نمی تونم ....
در ضمن من قبلا یه جایی خوندم که این شکل ایجاد کانکشن مربوط به 2003 میشه و من دارم با 2005 کار می کنم ...
اگر اشکال کار اینجاست شکل صحیح 2005 رو برام بزارین ....
اگر هم که نه ...
ببینید من یه combobox دارم که با فیلد name این table پر شده . حالا می خوام وقتی یه نام از combobox انتخاب شد ، id اون نام رو از بانکم بخونم و ذخیره کنم ....
این table دو تا فلید به اسم name , id داره که توش هر نام یه کد مشخص و مختص داره ( فیلد id فیلد کلیده )...
حالا بگید که چکار کنم ....
در هر صورت راهنمایی کنین ...

meh_secure
پنج شنبه 12 بهمن 1385, 00:00 صبح
اولا اینکه پارامتر های ورودی DataAdapter شما اشتباه می باشد. یکی از پارامتر ها باید دستور اس کیو ال و دیگری باید کانکشن شما(در اینجاconnect) باشد.
دوم اینکه اسم Table شما چیست؟

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 00:31 صبح
دوست من شاید از حرفم بدت بیاد یا هر فکر دیگه ای . چرا با خودتون اینطوری میکنید ؟ یک کتاب sql یک کتاب ado.net بگیر و آروم آروم بخون . تا راحت بشی . باور کن من میدونم داری اذیت میشه هر تیکه از این برنامه ها برات یه علامت سوال گنده میشه و کلی طول میکشه تا هر کدوم رفع بشه . یکبار برای همیشه کار رو تموم کن . بازم امیدوارم عکس العمل فکریت نسبت به من بد نباشه اما ایرادات در اصول است و این خیلی بده . بازم امیدوارم کسی فکر نکنه من هدفم کوچیک کردن کسی است . ولی این رو به عنوان کسی که حدود 10 سال درست یا غلط برنامه های حتی بد و دری وری نوشته گفتم و هدفم هم خیر بود

یا علی

مهدی رحیم زاده
پنج شنبه 12 بهمن 1385, 08:55 صبح
اول سلام
علی آقا نه ...
من اصلا هم ناراحت نمی شم از حرف شما دوست عزیز ...
خوب یه کتاب فارسی معرفی کنید ....
اما در مورد ایجاد این کانکشن حتما کمکم کنید آخه خیلی مهم و ضروریه ....
می خوام یه برنامه بنویسم که روی هر کامپیوتری خیلی راحت بتونه با بانک ارتباط برقرار کنه ....
در ضمن بانک من access .....
خیلی خوبین همتون ....
meh_secure عزیز :
اسم table من combo1 و دو تا فیلد به اسم id , name داره ....
من با همین دستور تونستم با بانک ارتباط برقرار کنم و داده تو بانک ذخیره کنم ، البته
وقتی که بانک رو تو یه مسیر خاص قرار می دم ....
یعنی به جای

Data Source=|DataDirectory|\\db1.mdb";
از این استفاده کنم

Data Source=c:\\program\\db1.mdb";
تو کد قبلی داده ها تو بانک ذخیره نمیشه .....
فقط علی آقا معرفی کتاب یادتون نره ....
e-book باشه خیلی عالی میشه .....

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 09:09 صبح
برای sql من برای 100 سال آیندت ebook دارم . بگو کدام شهری با آدرس تا کتاب بارانت کنم . فارسی هم کتاب t sql در 21 روز برای یادگیری اصول کدنویسی در sql 2000 عالی است . فارسی هم هست . برای روشهای اتصال به بانک به دات نت هم بازم ebook دارم . برات اگر خواستی آنها رو هم میفرستم چون کتاب فارسی برای این کار خوب نیست. و اما مشگل شما


oledbconnection cn =new oledbconnection(connectionstring)


خب چون سیستم کاری access فایلی است باید اگر بخواهی برنامت توی هر مسیری کار بده فایل بانک شما درست کنار exe شما یا درون یک FOLDER کنار EXE شما باشه . بعد توی connection string به جای مسیر فایل از application.startuppath باید استفاده کنی تا برنامت هر کجا کپی شد کار کنه . و اما دیتا أداپتر : برای ایجاد دیتاآداپتر باید از قبل coonection داشته باشی در بعد اینطوری است کار



oledbdataadapter da=new oledbdataadapter(yourquery,cn);

دقت کن الان در پارامتر دوم از cn که قبلا ساختم استفاده کردم . حالا شما یک query توی دیتا آداپتر نوشتی که یکسری رکورد رو برات بر می گردونه . خوب این رکوردها باید کجا بره؟ شما الان به یک منبع نیاز داری مثلا دیتاست . پس اول دیتا ست رو بساز



dataset ds =new dataset();


خب حالا با دستور fill رکوردها رو بریز توی دیتا ست اینطوری



da.fill(ds,"yourtablename");


البته پارامترهای دستور fill چند تا دیگه هم هست همونجا می تونی تست کنی .

خب حالا یک دیتاست حاوی رکورد داری هر کاری دوست داشتی باهاش بکن

مهدی رحیم زاده
پنج شنبه 12 بهمن 1385, 21:40 عصر
سلام علی آقا
به خدا خیلی گلی ...
یه مشکلی هست من بجنوردم یعنی حدود 700 800 کیلومتر دور تر از شهر شما ....
در هر صورت اینم آدرس:
اما اگر لطف کنین و ebook ها رو برسونین به من خیلی ممنون می شم .....

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 22:52 عصر
بابا من سئ دی فرستادم اون ور دنیا میگی بجنورد دوره . می فرستم برات .

مهدی رحیم زاده
دوشنبه 16 بهمن 1385, 06:52 صبح
خوب دوست های عزیز ....
اول از همتون ممنونم که این همه کمکم کردین....
اما نشد ....
این کانکشن منو خیلی اذیت کرد ....
اگر میشه یکی کدش رو بنویسه و بزاره ....
یعنی هر جا کپی کردیمش بتونه با بانک ارتباط برقرار کنه application.startuppath
ببینید table من دو تا فیلد داره درست ....id , name حالا می خوام وقتی یک name تو combobox انتخاب شد ، مقدار id اون name تو یک متغییر ذخیره بشه ....
علی آقا باید ببخشید اما گفتم که این کد رو خیلی ضروری لازمش دارم ...
فقط اگر میشه کل کد کانکشن رو بزارید ....
ممنونم ....

essa_61
دوشنبه 16 بهمن 1385, 11:58 صبح
سلام دوست عزیز بهترین راه برای استفاده از کانکشن از خود دات نت است چرا خودت تایپ می کنی کافیست که یک کانکشن اتوماتیک بسازی به این صورت که از قسمت tools گزینه connect to data base را انتخاب کن سپس از قسمت مربوط به موتور جستجو گر گزینه Microsoft.Jet.OLEDB.4. را انتخاب کن سپس مسیر فایل اکسس را بده حالا برای شما یک کانکشن می سازد روی کانکشن یک کلیک کن تا انتخاب شود سپس در قسمت پراپرتی ها یک گزینه هست به نام connection string این را کپی کن و هر جا خواستی استفاده کن

مهدی رحیم زاده
دوشنبه 16 بهمن 1385, 22:44 عصر
خوب دوست عزیز و گل من کانکشنی می خوام که روی هر کامپیوتری به راحتی بتونه با انک ارتباط برقرار کنه . نیازی به تغییر computername و این چیزا نداشته باشه ، در ضمن بان هرجا که بود برنامه بتونه با اون ارتباط بر قرار کنه ....

egoldashraf
دوشنبه 16 بهمن 1385, 23:41 عصر
اگه دیتا بیس در کنار فایل اجرایی برنامه باشه این کانکشن مشکلی نداره

OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb");

اگه مشخص نبود بگو کد چیزی که میخوایی رو بزارم

mehranFX
دوشنبه 16 بهمن 1385, 23:51 عصر
اتصال به انواع منابع داده را بیا موزید ! (http://barnamenevis.org/forum/showthread.php?t=60833)

Asad.Safari
سه شنبه 17 بهمن 1385, 00:07 صبح
بابا من سئ دی فرستادم اون ور دنیا میگی بجنورد دوره . می فرستم برات .

من به آقای کلاهدوزان ایمان دارم !
حتما براتون میفرستن !
علی آقا یه بار ما رو شرمنده خودشون کردند !


بازم ممنون !



موفق باشید

مهدی رحیم زاده
سه شنبه 17 بهمن 1385, 07:52 صبح
ببینید من تا حالا تونستم که با این کد کانکشن رو ایجاد کنم :

string strcom="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\db1.mdb";
خوب من یه combobox دارم و اون رو با اطلاعات بانکم پر کردم .حالا می خوام وقتی که مثلا من تو combobox یک نام رو انتخاب کردم مقدار فیلد id همون نام بره و تو یک متغییر ذخیره شه ....
اصلا ببینید من چی می خوام :
من سه تا table دارم و سه تا combobox ، توی tableها هر کدوم یه نام و یه id دارن که تو دومی علاوه بر اونا id اولی و تو سومی علاوه بر id , name خودش id دومی و اولی وجود داره حالا می خوام وقتی که تو combobox اول یه نام انتخاب شد combobox دوم بیاد و از table دوم نامهایی رو که id (مربوط به table اول که تو table دوم هم هست) اون برابر نام table اول هست رو نشون بده و همینطور برای سومی و در آخر بشه از سومی یک سری فیلد دیگه رو هم برداشت کرد ....
مثال دقیق تر و روشن تر :
ما تو جدول اول نام دبیرستان ها رو ذخیره کردیم ، تو دومی نام کلاس و تو سومی نام دانش آموز ها بهمراه نمرات سه تا درسشون . حالا وقتی که از جدول اول نام یک دبیرستان رو انتخاب می کنیم ، کومبو باکس دوم با نام کلاس های همون دبیرستان پر بشه و وقتی که نام یک کلاس انتخاب شد اسم دانش آموز های اون کلاس بیاد و تو کومبو باکس سوم قرار بگیره و در آخر وقتی که نام یک دانش آموز انتخاب شد نمرات هر سه تا درسش به همراه جمع اون ها روی یک فرم نشون داده بشه ....
اکر لطف کنید و کدش رو برام بزاریم یا حد اقل راهنمایی کنید خیلی ممنون می شم ....

aligh662000
سه شنبه 17 بهمن 1385, 09:39 صبح
من سه تا table دارم و سه تا combobox ، توی tableها هر کدوم یه نام و یه id دارن که تو دومی علاوه بر اونا id اولی و تو سومی علاوه بر id , name خودش id دومی و اولی وجود داره حالا می خوام وقتی که تو combobox اول یه نام انتخاب شد combobox دوم بیاد و از table دوم نامهایی رو که id (مربوط به table اول که تو table دوم هم هست) اون برابر نام table اول هست رو نشون بده و همینطور برای سومی و در آخر بشه از سومی یک سری فیلد دیگه رو هم برداشت کرد ....

من هم دقیقآ همین سوال را داشتم :لبخند:
البته پر کردن جدا جدا combo ها مشکلی نیست
اما این متغییر ها منو کچل کرده تو #C ! :عصبانی++:

essa_61
سه شنبه 17 بهمن 1385, 10:14 صبح
عزیزم کنکشن رو اتو ماتیک بساز و string رو بردار و اون اتوماتیک رو پاک کن و ازش استفاده نکن فقط از استرینگش استفاده کن و اضافی ها شو هم پاک کن مثل computer name

essa_61
سه شنبه 17 بهمن 1385, 10:23 صبح
غذر می خوام اشتباه فرستادم
دوست عزیز شما توی event --drop دو تا کمبو اولی به طور جدا گانه یک فیلتر برای بانک می گذری
به این صورت که در کمبو اولی یک کد می نویسی که بانک دوم را فیلتر کنه بر اساس string که شما در کمبوی اول انتخاب کردید من حالا نمی دونم که شما این کد را می تونی بنویسی یا نه اگر نمی تونی بگو من یک مثال برات می نویسم تا از روش متوجه بشی

ebtekar
سه شنبه 17 بهمن 1385, 10:28 صبح
مرسی مشکل من هم همین بود و لی من از طریق یه کلاس وصل می شدم به این گونه که مقدار آدرس اسم دیتا بیس و پسوردم رو به یه کلاس ارسال می کردم دیتا بیس رو پیدا می کرد و لی بازش نمی کرد

برای در یافت نمونه از سایت
www.pscode.com (http://www.pscode.com) قسمت C# برنامه کتاب خانه

essa_61
سه شنبه 17 بهمن 1385, 10:32 صبح
دوست عزیز من کد ها رو تکه تکه واسط می فرستم این یک مثال از بر نامه خودم است این کد را در فرم لود برای کمبوی اولیت می نویسی

OleDbConnection conn = new OleDbConnection("coonection string;)
OleDbDataAdapter da = new OleDbDataAdapter("SELECT DISTINCT ReceiptDate FROM tblParcels ORDER BY ReceiptDate DESC",conn);
ds_a = new DataSet() ;
conn.Open() ;
da.Fill(ds_a,"setoontarykh");
conn.Close() ;
دو سطر آخر کمبو باکس اول را به دیتا ست پر شده ارتباط می دهد
cmd_date.DataSource = ds_a.Tables["setoontarykh"];
cmd_date.DisplayMember="ReceiptDate" ;


ReceiptDate نام ستون بانک اول که قرار است بانک دوم بر اساس آن فیلتر شود
connection string مسیر دیتا بیس

essa_61
سه شنبه 17 بهمن 1385, 10:39 صبح
خب اینجا باید تونسته باشی کمبو باکس اولت رو با بانک اولت پر کنی حالا باید بتونی با انتخاب از کمبو باکس اول کمبو باکس دوم رو از بانک دوم پر کنی این هم کد بعدی


DataSet ds_b = new DataSet();
//cls_public.sqlpath این مسیر دیتا بیس
OleDbConnection conn = new OleDbConnection(cls_public.sqlpath);
OleDbDataAdapter da = new OleDbDataAdapter();
//@v_tarykh این متغیریست که بانک دوم را فیلتر می کند و اگه دقت کنی مقدار متغیر برابر مقدار انتخاب شده در کمبو باکس اول است
OleDbCommand comm1 = conn.CreateCommand();
comm1.CommandText ="SELECT DISTINCT SenderName FROM tblParcels WHERE(ReceiptDate LIKE @v_tarykh) ORDER BY SenderName";
if(cmd_date.Text=="") cls_public.tarykh="%" ;
else
cls_public.tarykh = cmd_date.Text ;
comm1.Parameters.Add("@v_tarykh",OleDbType.VarChar,10).Value=cls_public.tarykh ;
da.SelectCommand = comm1 ;
conn.Open() ;
da.Fill(ds_b,"ferestande");
conn.Close() ;
cmd_sender.DataSource = ds_b.Tables["ferestande"];
cmd_sender.DisplayMember="SenderName" ;

essa_61
سه شنبه 17 بهمن 1385, 10:40 صبح
حتما بگو که چی کار کردی

aligh662000
سه شنبه 17 بهمن 1385, 10:40 صبح
مرسی مشکل من هم همین بود و لی من از طریق یه کلاس وصل می شدم به این گونه که مقدار آدرس اسم دیتا بیس و پسوردم رو به یه کلاس ارسال می کردم دیتا بیس رو پیدا می کرد و لی بازش نمی کرد

برای در یافت نمونه از سایت
www.pscode.com (http://www.pscode.com) قسمت C# برنامه کتاب خانه

سلام و تشکر!
ولی ممکنه که لینک همون نمونه برنامه رو اینجا بزارید!؟

مهدی رحیم زاده
سه شنبه 17 بهمن 1385, 17:29 عصر
خوب سلام
ممنونم از اینکه این همه دوستای عزیز لطف دارن اما نشد ....
یعنی من هیچی نفهمیدم ...
بزارین من دقیقا برناممو بازش کنم و شما بعد کمکم کنید :
من یه بانک access دارم به اسم db1.mdb که توش سه تا table دارم اسم اولی combo1 و فیلداش id, name و table دوم combo2 و فیلداش id_1 , id , name و table سوم combo3 و فیلداش id_1 , id_2 , name , num1 ,num2, info .
id_1 , id_2 که فلید ای دی دو تا جدول 1 و 2 .
یعنی وقتی از جدول اول نام یک دبیرستان انتخاب شد مقدار id اون تو یک متغییر ذخیره بشه و بعد از جدول دوم هر کدوم که فلید id_1 اون برابر این مقدار ذخیره شده بود تو کومبو باکس نشون داده بشه ( یک دبیرستان که انتخاب شد تمام کلاس های اون تو کمبو دوم نشون داده بشه ) و همیجنور برای جدول سوم ....
و تو جدول سوم مقدار num1,num2,info هر کدوم تو یه متغییر جداگانه قرار بگیرن و ذخیره بشن تا بشه از اونا استفاده کرد ....
حالا من با ارتباط با بانک و پر کردن کومبوی اول هیچ مشکلی ندارم و مشکل من از بعد پر کردن کمبوی اول هستش ....
اگر یکی پیدا شه و با اطلاعات بالا کدش رو برام بزاره خیلی ممنون می شم ..
مرسی :چشمک: :بوس: :خجالت:

egoldashraf
سه شنبه 17 بهمن 1385, 19:32 عصر
امیدوارم درست متوجه شده باشم

مهدی رحیم زاده
سه شنبه 17 بهمن 1385, 22:54 عصر
Data type mismatch in criteria expression.
این اشکال رو روی این کد میگیره ، چرا ؟

comboBox2.DataSource = GetData("select name from combo2 where id_1='" + Convert.ToString(comboBox1.SelectedIndex + 1) + "' order by(id_2)");
و یه چیز دیگه من چطوری به فلید های اون name انتخاب شده از کمبوی 3 دسترسی داشته باشم یعنی مثلا مقدار num1,num2 مربوط به name انتخاب شده در کمبوی 3 رو تو دو تا متغییر صحیح ذخیره کنم ....
بازم مرسی ....

egoldashraf
سه شنبه 17 بهمن 1385, 23:55 عصر
اون ارور مربوط به تفاوت در طراحی دیتا بیس من با دیتا بیس شماست .
با یه مقایسه کوچیک متوجه میشید
احتمالا فیلد های ID در دیتا بیس شما عددی هستند

مهدی رحیم زاده
چهارشنبه 18 بهمن 1385, 06:47 صبح
دوست عزیزم شما درست میگید ...
دوباره همون اشکال رو می گیره اما این بار روی این کد :

comboBox1.DataSource = GetData("select name from combo1 order by (id_1)");
در ضمن تمام فیلد های id من عددی هستن و یعنی باید باشن ....
حالا بگید که چکار کنم ....
مرسی و ممنون :چشمک::بوس::خجالت:

egoldashraf
چهارشنبه 18 بهمن 1385, 09:06 صبح
اینم اینجوریش!!!

aligh662000
شنبه 21 بهمن 1385, 14:43 عصر
این برنامه آخر یک اشکال عمده داره اونم اینکه چیزیکه دوتا کمبو باکس را بهم مربوط میکنه selectindex هستش! در حالیکه باید selectvalue باشه چون ما با id تیبل اول به تیبل دوم وصل میشیم که الزامآ مساوی ای ایندکس نیست
اما نمیشه با این دستور مقدار عددی value رو بر گردوند
idd = comboBox1.Selectedvalue; البته میدونم سوال در حد پایینی هستش اما اگر کسی توضیح بده چه جوری میشه این مقدار را در یک متغیر عددی مثل idd ریخت متشکر میشم!

egoldashraf
شنبه 21 بهمن 1385, 16:42 عصر
اگه منظورت مقداریه که کمبو باکس داره نشون میده:
idd=convert.toint16(combobox.text);l
یا اگه میخواهی مطابق با فیلد id رفتار ها رو تنظیم کنی، با همین مقدار combobox.text کافیه که یه دستور sql بنویسی که id مورد انتخاب شده رو برگردونه.

مهدی رحیم زاده
جمعه 27 بهمن 1385, 11:37 صبح
سلام
خوبید ...
امروز من اومدم و برنامم رو دوباره شروع کردم .
با این کد combo1 رو پر کردم:

comboBox1.DataSource = getdata("select name from combo1");
comboBox1.DisplayMember = "name";
با این کد combo2 :

comboBox2.Text = "";
comboBox3.Text = "";
DataTable dt = new DataTable();
dt = getdata("select id_1 from combo1 where name='" + comboBox1.Text + "'");
if (dt.Rows.Count != 0)
comboBox2.DataSource = getdata("select name from combo2 where id_1=" + dt.Rows[0]["id_1"]);
comboBox2.DisplayMember = "name";
و با این سومی رو :

comboBox3.Text = "";
if (comboBox2.Text != "")
{
DataTable dt = new DataTable();
dt = getdata("select id_2 from combo2 where name='" + comboBox2.Text + "'");
if (dt.Rows.Count != 0)
comboBox3.DataSource = getdata("select name from combo3 where id_2=" + dt.Rows[0]["id_2"]);
comboBox3.DisplayMember = "name";
}
داده ها میان و تو کومبو باکس ها قرار می گیرن ولی وقتی یه داده رو انتخاب می کنم که داده برای اون تو فیلد های بعدی خالیه کومبوی سومی خالی نمیشه .
یعنی مثلا وقتی که من زاهدان رو انتخاب می کنم و هیچ مدرسه ای تو اون نیست ، کلاس های مربوط به آخرین مدرسه تو کومبوی سومی باقی مونده و میشه اونا رو انتخاب کرد . در حالی که نباید اینجوری باشه ...
ولی خوب کومبوی دوم کاملا خالی میشه ...

PC2st
جمعه 27 بهمن 1385, 13:52 عصر
برای دستور (if (dt.Rows.Count != 0 اگر برابر صفر باشه، هیچ کدی تعریف نشده، پس باید یک else هم اضافه کنی تا درصورتی که خالی بود، combo هم خالی بشه...

مهدی رحیم زاده
شنبه 28 بهمن 1385, 06:38 صبح
egoldashraf عزیز سلام
خوبی عزیز ....
من یه مشکل داشتم و اون اینه وقتی نام یک شهر رو انتخاب می کنم که هیچ دبیرستان و کلاسی نداره و باید دو تا کومبو ها خالی بشن سومین کومبو با آخرین داده هایی که پر شده ، پر میمونه ...
یعنی خالی نمیشه . متاسفانه برنامه شما هم که برای من نویشتید همین مشکل رو داره . اگر میشه در مورد این هم یه توضیح بدین که چطوری رفع کنمش ....
ممنونم

egoldashraf
شنبه 28 بهمن 1385, 19:34 عصر
خدمت شما !