كار با بانك اطلاعاتي در c++.net

sara_she

Member
براي كار با datagrid كافي اونو رو فرم بذارين و مقادير datasource و datamember‌اونو به ترتيب با dataset و نام جدولتون پر كنيد يا كد زير رو بنويسيد:
کد:
 OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);
                oleDbDataAdapter1->Fill(dataSet11,"project");
		        dataGrid1->DataSource=dataSet11;
 

sara_she

Member
شرطي كه من براي نمايش ركورد خاصي در readerمينويسم مربوط به كليد اصلي جدوله يعني براي اين شرط تنها يك ركورد خاص از جدول وجود داره و همون تو reader نمايش داده مي شه

ولي به نظر شما اگه بخواهيم براي چند ركورد اين كار رو داشته باشيم استفاده از حلقه while‌با شرط reader->readدرسته؟
 

saalek110

Well-Known Member
اولا تا اینجا من وقت نشده مطالعه کنم و هر چه بوده از کدهای شما یاد گرفته ام.

دوما راجع به شرط Read من مثال زدم و گفتم در آبجکت بروسر متدها را ببینید تا ببینیم چه متدی به کارمان می آید. این متد Read را هم اتفاقی در یک کتاب دیدم و سریع در ادامه پست گفتم تا شاید مفید باشد. ولی فکر کنم خیلی کارها میشه باهاش کرد. چون کار مهمی انجام می دهد. یعنی خواندن. میشه با شرطها و ارتباط با کاربر مخلوطش کرد و چیزهای جالبی ساخت. البته فکر کنم اگر با متدهای دیگر ترکیب بشود قوی تر بشود مثلا متدی به نام next داریم. و ....کلا چیزی ندارم بگم راجع به آنها فعلا . باید سورس یا کتابی را ببینم. شما هم اگر آن سورسهای میکروسافت را دانلود کردید همه الگوها را سعی کنید پیاده کنید. چون دیگه منبع معتبرتر از سایتهای دیگه است. من سورسهای دیتابیسش را همه را اجرا کردم ولی همه می خواستند به sql server وصل بشوند که من هنوز نتوانسته ام راه بیاندازم آن را. ولی فکر کنم به راحتی به Oledb بشه تبدیلش کرد. من هم سعی می کنم کار کنم.

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

سوما ممنون از راهنمایی برای راه انداختن دیتاگرد.
 
آخرین ویرایش:

saalek110

Well-Known Member
من در حال مرور سورسهای میکروسافت هستم که در پستهای قبلی لینک دانلودش را گذاشتیم. ده مگا.
دنبال کدی برای خواندن ردیف های دیتاست هستم.

اما.....
کدهایی از این سورس ها را اینجا پست می زنم تا بعدا مورد استفاده خودم و دیگران قرار بگیرد.

زبان : ویژوال سی ++ دات نت 2003

کد:
		static String* SQL_CONNECTION_STRING = S"Server=localhost;DataBase=Northwind;Integrated Security=SSPI";
		static String* MSDE_CONNECTION_STRING = S"Server=(local)\\NetSDK;DataBase=Northwind;Integrated Security=SSPI";

ما در این تاپیک با اکسس کار کردیم. و کد بالا استرینگ کانکت به sql server است. که من هنوز نتوانسته ام وصل شوم.

کد:
			frmAbout* frm = new frmAbout();
			frm->ShowDialog(this);

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

کد:
	this->Close();

این هم که به احتمال بسیار بالا باعث بستن فرم است. چون امتحان نمی کنم کدها را همه را با احتمال می گم ولی این کد در همه زبانها همین کار را انجام می دهد.

کد:
			String* myColors[] = new String*[7];
			myColors[0] = S"AQUA";
			myColors[1] = S"BLACK";
			myColors[2] = S"BLUE";
			myColors[3] = S"GREEN";
			myColors[4] = S"RED";
			myColors[5] = S"WHITE";
			myColors[6] = S"YELLOW";
			ComboBox1->DataSource = myColors;

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

کد:
			ComboBox1->SelectedIndex = 0;
			GroupBox1->Visible = false;

این هم احتمالا ایندکس کومبوباکس را تنظیم می کند. و بعدی هم مخفی نگه داشتن کومبوباکس است.

کد:
			ArrayList* myShapes = new ArrayList;
			myShapes->Add(S"CIRCLE");
			myShapes->Add(S"OCTAGON");
			myShapes->Add(S"RECTANGLE");
			myShapes->Add(S"SQUARE");
			myShapes->Add(S"TRAPEZOID");
			myShapes->Add(S"TRIANGLE");

			ComboBox1->DataSource = myShapes;

در اینجا برخلاف کد قبلی که آرایه را در کومبو باکس می ریختیم داریم ArrayList را داخلش می ریزیم.

کد:
			// Bind to an arraylist that contains entries based on the above defined 
			// structure for sales divisions (divisions).
			ArrayList* myDivisions = new ArrayList;

			// add division structure entries to the arraylist
			myDivisions->Add(new Divisions(S"CENTRAL", 1));
			myDivisions->Add(new Divisions(S"EAST", 2));
			myDivisions->Add(new Divisions(S"NORTH", 3));
			myDivisions->Add(new Divisions(S"SOUTH", 4));

			// bind the arraylist to the combo box
			ComboBox1->DataSource = myDivisions;
			ComboBox1->DisplayMember = S"Name";
			ComboBox1->ValueMember = S"Id";

			ComboBox1->SelectedIndex = 0;
			lblAssociated->Text = ComboBox1->SelectedValue->ToString();
			GroupBox1->Visible = true;
			lblSource->Text = S"ArrayList-Advanced";

اینها هم مربوط به همان ها.

کد:
			// Bind to the products table from the Northwind database that has 
			//   previously been loaded into the dataset dsProducts.
			//  Note that the table has not been sorted in any particular order.
			ComboBox1->DataSource = dsProducts->Tables->Item[S"PRODUCTS"];
			ComboBox1->DisplayMember = S"ProductName";
			ComboBox1->ValueMember = S"ProductID";

			ComboBox1->SelectedIndex = 0;
			lblAssociated->Text = ComboBox1->SelectedValue->ToString();
			GroupBox1->Visible = true;
			lblSource->Text = S"DataSet";

رسیدم به همان جا که می خواستم.
یعنی استفاده از محتویات dataset داخل برنامه.
پس فعلا کار را متوقف می کنم تا ببینم چطور میشه با این کد کار کرد.
 
آخرین ویرایش:

sara_she

Member
سلام
خسته نباشيد

مي خواستم بدونم شما چرا براي اتصال به ديتابيس از رشته اتصال ستفاده مي كنيد چرا مستقيما كامپوننت هاي آماده رو به كار نمي بريد ؟

كافيه يه oledbadapter‌ از زبانه data رو انتخاب كنيد و مراحل ساخت connection‌رو پيش ببريد .در پنجره ابتدايي نام بانك از شما پرسيده مي شه و در ادامه query‌ مور نظر كه خيلي مهم نيست و مي تونيد بعدا تو كد نوسي تغييرش بدين . در واقع من از adapter‌فقط براي ساخت connection‌استفاده مي كنم و تو كدنويسي adapter‌رو مقدار دهي ميكنم

منتظر پاسخ شما در مورد datagrid و يا خواندن رديف هاي dataset با datarow‌ هستم . چون متوجه شدم شما استعداد فراواني در search مطالب و نكات مورد نظر داريد

با تشكر
 

saalek110

Well-Known Member
سلام.
من دیروز روش شما را بکار بردم. و جواب هم داد. ولی چون من هر وقت یک پروژه می سازم از پروژه قبلی کدهای قبلا کار شده را کپی پیست می کنم برای من راحت تره تا کد باشد. تا زدن دکمه ها. البته قصد دارم روشهای بصری را با روشهای کدنویسی بعدا با هم مقایسه کاملتری بکنم.

اما راجع به پروژه همین الان دارم کار می کنم. دیروز کار کردم که نمی گذاشت تیبل ها را به شکل آرایه صدا بزنم و امروز فهمیدم باید از کلمه Item استفاده کنم. البته زوده نظر داد. باید کدش را کامل کنم.
 

saalek110

Well-Known Member
برنامه : می خواهیم از دیتاست ردیف هایی را بخوانیم و در کومبوباکس و لیبل نمایش دهیم.
زبان : ویژوال سی ++ دات نت 2003

ابزارها : یک دکمه – یک کومبوباکس – یک لیبل

Using :
کد:
using namespace System::Data::OleDb;

دیتابیس : اکسس. پس فایل دیتابیس خود را در محل مناسب قرار دهید. من با فایلی به نام ClassProjects کار می کنم که در پستهای قبلی همین تاپیک قابل دانلود است.

نکته : با نگاه به سورس های میکروسافت می بینیم که در کلاس فرم در قسمت protected می توانیم اشیایی تعریف کنیم. مثل اینها:

کد:
		DataSet* dsProducts;
		DataView* dvProducts;

		static String* SQL_CONNECTION_STRING = S"Server=localhost;DataBase=Northwind;Integrated Security=SSPI";
		static String* MSDE_CONNECTION_STRING = S"Server=(local)\\NetSDK;DataBase=Northwind;Integrated Security=SSPI";

و تعریف کردن در این قسمت احتمالا می تواند باعث ایجاد پلی برای ارتباط بین کدهای رویدادهای مختلف ابزارهای مختلف باشد.
ولی در پروژه ما که تمامی کدها داخل رویداد کلیک باتون قرار دارد فعلا نیازی به ایجاد این پلها نیست.

کد باتون:

کد:
            // code button1_Click
		    // ebteda yek Connection misazim(ghablesh string ash). 
		    //     badesh aAdapter   misazim(ghablesh queri  ash).
		    //     badesh dataset    misazim.
		    //     badesh baa adapter dataset raa por mikonim.
			String           *connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\ClassProjects.mdb";
            OleDbConnection      *myConnection = new OleDbConnection(connectionString);
            String                      *query = "select * from PROJECT";
			OleDbDataAdapter        *myAdapter = new OleDbDataAdapter(query, myConnection);
			DataSet              *PROJECT_dataset = new DataSet();
            myAdapter->Fill(PROJECT_dataset, S"PROJECT");
			// =========================================
			// yek DataView misaazim. 
			// combobox ra be DataView e khod(dvProducts) vasl mikonim.
			// namayeshe combobox raa be sotoni az table e database vasl mikonim:
			// yani iin code:  comboBox1->DisplayMember = S"Code";
			// valuemember e combobox ra ham be sotone digari az database vasl mikonim.
			// yani iiin code : comboBox1->ValueMember = S"Title";
			// indexe combobox ra ham ta.iin mikonim.
			// lable raa be combobox vasl mikonim.
			DataView* dvProducts=new DataView(PROJECT_dataset->Tables->Item[S"PROJECT"], S"", S"Code ASC", DataViewRowState::OriginalRows);
			comboBox1->DataSource = dvProducts;
			comboBox1->DisplayMember = S"Code";
			
			comboBox1->ValueMember = S"Title";
			comboBox1->SelectedIndex = 0;
			label1->Text =comboBox1->SelectedValue->ToString();

خلاصه کد اینه که :
با زدن دکمه به دیتابیس وصل می شویم.
یک ستون دیتابیس ( Code ) در کومبوباکس نمایش داده می شود.
بعد آن که در کومبوباکس در حال انتخاب است در لیبل نمایش داده می شود. البته از ستون Title دیتابیس که همان ValueMember کومبوباکس است.


c3.gif

 
آخرین ویرایش:

sara_she

Member
سلام
از كدي كه گذاشتين ممنونم

يه سوال ديگه برام پيش اومده . اگه بخواهيم تو يه پروژه cppكه فرم هم نداره با بانك اطلاعاتي كار كنيم امكان داره؟

و در اينصورت نمي شه از كامپوننتهاي آماده استفاده كرد .]چه هدرهايي بايد به cppخود اضافه كنيم ؟ اگه براتون امكان داره رشته اتصال رو با oledbconnection توضيح بدين در صورتي كه بانك تو sql server باشه بازم پسوندش mdb است؟

ممنون و موفق باشيد
 
آخرین ویرایش:

saalek110

Well-Known Member
راجع به سئوال اول شما خیلی موضوع جالبیه. من هم دوست داشتم امتحان کنم.
راجع به کامپوننت آماده هم حتما ممکن است. چه خودمان بنویسیم. چه دانلود کنیم.
راجع به sql server من همچنان در حال تلاش برای راه اندازی آن هستم. ولی هنوز موفق به این کار نشده ام.


=========================================

برای راحتی خوانندگان این تاپیک قسمت سورسهای دیتابیس میکروسافت که قبلا لینکش را گذاشتم را آپلود کردم.
حدود 1 مگا می شود. و شامل 11 پروژه.

http://rapidshare.com/files/34769703/source_microsoft_vc2003.rar.html

البته می دانید که اگر کسی این فایل را دانلود نکند بعد 1 تا 3 ماه به طور اتوماتیک دیلت می شود.
 
آخرین ویرایش:

sara_she

Member
منظور من در پست قبل از كامپوننتهاي آماده همين adapter و connectionكه تو زبانه data وجود دارند بود در واقع مي خواستم بگم وقتي يه فايل cpp‌بدون فرم داريم تمام اجزاي ديتابيس رو بايد خودمون تو كد بياريم و نمي تونيم از ويزادهاي اماده استفاده كنيم . حالا منم همين اشكال رو دارم كه مي خوام تو فايل cpp اتصال ايجاد كنم به بانك sql خودم با oledb ولي تعريف connectionstringرو نمي دونم

من از روي oledbconnection ي كه با گذاشتن oledbadapter‌روي فرم توليد كردم از قسمت connectionstring‌آن رشته رو كپي و تو فايل cpp خودم paste كردم به صورت زير بود :

کد:
String     *connectionString = "Integrated Security=SSPI;Packet Size=4096;Data Source=".";Tag with column collation when possible=False;Initial Catalog=cad;Use Procedure for Prepare=1;Auto Translate=True;Persist Security Info=False;Provider="SQLOLEDB.1";Workstation ID=SOFT1;Use Encryption for Data=False";

ولي كار نمي كنه . از كد شما هم خواستم استفاده كنم كه ديدم فايل ديتابيس تون mdb. است ولي من sqlserver كار مي كنم و نمي دونم پسوند ديتابيس اونجا چيه؟
 
آخرین ویرایش:

saalek110

Well-Known Member
منظور شما را از کامپوننت فهمیدم.
به نظرم باید همه را از کد استفاده کنیم.
یعنی یک پروژه کار کنیم تماما با کد برای اتصال به دیتابیس. باید امتحان بشه.

من در حال وصل شدن به sql server هستم. در پستهای بعدی روند کار را توضیح می دهم.

===================================
پاسخ به پست بعد:
منظورم اینه که توانستم در کنترل پنل کانکشن را بطور موفقیت آمیز ایجاد کنم و حالا فقط نیاز دارم از محیط ویژوال استودیو با برنامه با آن کار کنم.
 
آخرین ویرایش:

sara_she

Member
سلام

منظور شما رو از اينكه در حال وصل شدن به sql server هستيد منوجه نشدم . نصب اين برنامه رو ميگيد يا كدنويسي و اتصال به اون مد نظرتون است؟
لطفا اگه مي خواهيد اون رو نصب كنيد در قسمتي كه username و password ‌رو درخواست مي كند اين قسمت رو غير فعال كنيد تا sql server شما بدون نياز به آنها لود شود تا وضعيتي مشابه از نظر اتصال داشته باشيم
چون تعريف username و password باعث تغيير د رشته اتصال مي شود
 

saalek110

Well-Known Member
با تشکر فراوان از دوست گرامی night11 که این مسئله را به من آموزش داد.

برای استفاده از sql server ئی که همراه ویژوال استودیو 2005 نصب می شود که نوعش sqlexpress است باید به ترتیب زیر عمل کرد:

ابتدا شما به full computer name نیاز دارید.
روی my computer در دسکتاپ کلیک راست کنید و properties را بزنید.
بعد در پنجره باز شده به tab مربوطه یعنی computer name بروید.
مطابق عکس زیر:

c4.gif


در عکس بالا عبارتی که جلوی full computer name نوشته شده.... نام کامپیوتر شماست. البته بدون نقطه انتهای آن. یعنی در شکل بالا می شود:
saalek-8bb42bed

مرحله دوم:
به کنترل پنل بروید و ادمینیسترتیو تولز را بزنید.
بعد در پنجره باز شده دیتاسورسز را بزنید.
بعد به tab مربوطه یعنی system dsn بروید.
روی add کلیک کنید.
در پنجره باز شده sql server را انتخاب کنید و finish را بزنید.
در پنجره جدیدی که باز می شود مطابق شکل زیر پرکنید و finish را بزنید.

c5.gif

یعنی نام کامل کامپیوتر بعلاوه یک بک اسلش و بعد عبارت sqlexpress .
در پنجره بعدی که باز می شود دکمه Test Data source را بزنید.
که اگر نوشت tests completed successfully
یعنی که کارتان را درست انجام داده اید و می توانید در ویژوال استودیو با برنامه خود به آن وصل شوید. و اگر نوشت Tests failed یعنی چیزی اشتباه است.
 
آخرین ویرایش:

sara_she

Member
من با 2003 كار مي كنم

اما منظورتونو از sql server ي كه همراه vs نصب مي شه متوجه نشدم.

يعني نياز به نصب جداي برنامه sql serverنداريم ؟

من هميشه sql serverرو جدا نصب مي كنم اين همه هم كار انجام نمي دم
 

saalek110

Well-Known Member
ورژن 2003 ویژوال استودیو همراهش sql server ندارد. ولی ورژن 2005 دارد. البته اکسپرس است. یعنی همان sql server 2005 معروف نیست.
 

sara_she

Member
سلام

من براي كار با sql server سي دي ورژن 2000 رو گرفتم كه با vs 2003 متناسب باشه . و موقع نصب اونو به صورت client server و بدون userو passwoerd در نظر مي گيرم

نمي دونم مشكلتون حل شده يا نه . در هر صورت من منتظر پاسخ پستهايي كه در ابتداي تاپيك داشتم هستم . مثل اينكه چطور با استفاده از dataset نه datereaderمي تونيم ركورد به ركورد با فيلدهاي بانك كار كنيم و ببينيم يه مقدار خاص تو يه فيلد خاص ار بانك وجود داره يا نه مثل چك كردن user و password كسي كه ميخواد به يك گروه login كنه و بايد چك كنيم كه عضو هست يا نه

موفق باشيد
 

saalek110

Well-Known Member
دو روز گذشته مقداری با دیتاگرد بایند نشده کار کردم. و ارتباط دادنش با دیتاتیبل. تابحال با دیتاگرد کار نکرده بودم و قدمهای اولیه را برمی داشتم.
راجع به سئوالات باقی مانده من نمی دانم در این تاپیک چه سئوالاتی هست. بی زحمت همه را در یک پست با شرح کامل قرار دهید.
این سئوالی هم که فرمودید (( چطور با استفاده از dataset نه datereader )) فکر کنم منظورتان روش دیسکانکتد است. فکر می کنم سورسهای زیادی پیدا میشه. می گردم.
 
آخرین ویرایش:

saalek110

Well-Known Member
لينك پستي رو كه توش سوال مربوط به dataset رو پرسيده بودم مي گذارم.با datareaderرو گفتيد ولي dataset مونده . چيزي كه گفتيد كاملا صحيحه اين روش disconnectاست

همین یکی مانده؟
من فکر کردم چند تا سئوال در این تاپیک بی جواب مانده. تاپیک صفحاتش زیاد شده و نمیشه همه را نگاه کرد.

اما راجع به این برنامه:
من همان موقع که اولی را حل کردم روی این(دومی) هم خیلی وقت گذاشتم. و مشکلاتم این ها بود:
انگار for each در سی پلاس دات نت نیست. البته شاید باشه . من نتوانستم بکار ببرم.
برای همین سعی کردم با آرایه همین کار را بکنم چون for each هم اعضای آرایه را می خواند. کافیه تعداد اعضا را بدانید که من توانستم با کلاسهای دات نت تعداد اعضا را دریابم ولی بعد نمی دانم در ادامه کار کجا دچار مشکل شدم.
کلا سینتکس سی پلاس کمی برای من باعث کندی میشه. باید یک کتاب آموزش سی پلاس دات نت را مرور کنم. مثلا ساخت تابع را باید یاد بگیرم.

======================

اما مسئله دوم:
و آن اینکه چرا ما اصلا راجع به ((داشتن و اجرا شدن sql server )) صحبت می کنیم؟
مگه نمیشه همه را با oledb تمرین کرد؟ به نظر من که میشه.
شما هم که مشکلی در کار با sql server ندارید. من ممکنه مشکل داشته باشم.
پس اگر در ایجاد کانکشن به sql server شما مشکل ندارید من کدهایم را با oledb کار می کنم. بعدش شما همان کدها را در پروژه خود که با sql server است بکار برید.

=====================

چند ساعت بعد:
بالاخره توانستم به sql server اکسپرس که همراه ویژوال استودیو 2005 نصب میشه وصل شوم.
و همچنین در آن ویندوز که ویژوال استودیو 2003 را نصب کرده بودم هم همین sql server اکسپرس ویژوال استودیو 2005 را نصب کردم و مشکلی پیش نیامد و تنظیمات کنترل پنل آن را هم انجام دادم. ( همان تنظیمات که با شکل از استاد گرامی night11 نقل کردم.)

خوب موانع برداشته شد. حالا می توانم به بحث ها برسم. بهر حال ببخشید من وسواس شده بودم که حتما sql server را راه بیاندازم. چون که با oledb هم میشد کدنویسی کرد.
 
آخرین ویرایش:

saalek110

Well-Known Member
کد:
        private void button1_Click(object sender, EventArgs e)
        {
            String my_connectionstring = "Provider=Microsoft.JET.OLEDB.4.0;data source=.\\ClassProjects.mdb";
            OleDbConnection my_Connection = new OleDbConnection(my_connectionstring);
            my_Connection.Open();

            OleDbDataAdapter oleDbDataAdapter1 = new OleDbDataAdapter("select * from project", my_Connection);
            DataSet ClassProjects_DataSet = new DataSet();
            oleDbDataAdapter1.Fill(ClassProjects_DataSet, "PROJECT");
            // int row_count = ClassProjects_DataSet.Tables.Count;  MessageBox.Show(row_count.ToString()); // print 1
           
           for (int j=0  ;j<ClassProjects_DataSet.Tables[0].Rows.Count;j++)
                {
    
            }

            foreach (DataRow my_row in ClassProjects_DataSet.Tables[0].Rows)
            {
                if (my_row[0].ToString() == textBox1.Text)
                {
                    label1.Text = my_row[2].ToString();

                }
            }
my_Connection.Close();

        }

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

sara_she

Member
سلام

كدي كه نوشته بوديد #c بود؟

در vb.netهم دقيقا همين طوره ولي من وقتي تو c++.netمي خوام for eachبنويسم اونو نمي شناسه. سعي ميكنم پي گيري كنم

از توجه تون ممنون
 

جدیدترین ارسال ها

بالا