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

saalek110

Well-Known Member
من همان برنامه بالا را با کد زیر توانستم حل کنم . (در وی سی ++ دات نت 2003) پس قضیه بالاخره حل شد. شما هم تست کنید.
کد:
String *constr ="Provider=Microsoft.JET.OLEDB.4.0;data source=.\\ClassProjects.mdb";
			
        OleDbConnection *con = new OleDbConnection(constr);
		OleDbCommand *myOleDbCommand = con->CreateCommand();

		    StringBuilder* query = new StringBuilder();
            query->Append("SELECT * FROM PROJECT WHERE Code ='");
            query->Append(textBox1->Text);
            query->Append("'");

		    myOleDbCommand->CommandText =query->ToString();
      //"SELECT * " +
      //"FROM PROJECT "+
      //"WHERE Code = '" + textBox1->Text + "'";

            con->Open();

	OleDbDataReader *myOleDbDataReader = myOleDbCommand->ExecuteReader();
            myOleDbDataReader->Read();


			MessageBox::Show(myOleDbDataReader->get_Item(0)->ToString());
			MessageBox::Show( myOleDbDataReader->get_Item(1)->ToString());
			MessageBox::Show( myOleDbDataReader->get_Item(2)->ToString());
			MessageBox::Show( myOleDbDataReader->get_Item(3)->ToString());
			MessageBox::Show(myOleDbDataReader->get_Item(4)->ToString());

           con->Close();
این برنامه را ابتدا در صفحه اول تاپیک با سی شارپ ساختم( لینک ). در صفحه دوم تاپیک با وی سی ++ 2005(لینک) و در این پست با وی سی ++ 2003 .
ولی باز شرح مختصری برای ساخت برنامه اضافه می کنم:
ابتدا یک پروژه دات نت ویندوزی ساختم.
یک باتون و یک تکست باکس اضافه کردم.(در موقع زدن کلید فراموش نشود مقدار مورد نظر را در تکست باکس بنویسید.یا اینکه از اول صفت آن را روی چیزی قرار دهید. )
در رویداد کلیک باتون کد را افزودم.
دیتابیس مورد نظر را به پروژه افزودم.(مسیر کد من این است که دیتابیس کنار فایل exe باشد.)
دو using افزوده شده. ((سیستم text)) (( سیستم دیتا ole دی بی)).
 
آخرین ویرایش:

sara_she

Member
سلام
از راهنماي هاي كارساز و دقيق شما ممنونم

كد شما رو تست كردم خوشبختانه جواب داد . من خودم تو جستجو هايي كه داشتم دستور SELECT‌رو به صورت زير پيدا كردم و امتحان كردم جواب داد :

کد:
String *strCmd = "SELECT * FROM project WHERE code ='";
                 String *strcmd2 ="'";
				 String *strTmp = String::Format("{0}{1}{2}",strCmd,textBox1->Text,strcmd2);
				 OleDbDataAdapter *oleDbDataAdapter1= new OleDbDataAdapter(strTmp,oleDbConnection1);

ولي خوب به اسوني كد شما نيست و براي چند شرط كنار هم بايد كلي احتياط به خرج بديم من كه نتونستم چند شرط رو كنار هم داشته باشم و دستورات INSERT و UPDATE و DELETE هم باهاش امتحان كردم ولي كار نكردند

از روش شما هم براي دستور INSERT‌ به صورت زير استفاده كردم ولي اجرا نشد يعني تو FILL كردن DATASET با مقدار نادرستي مشكل پيدا مي كنه

کد:
DataSet *dataSet11=new DataSet;
			    StringBuilder *query = new StringBuilder();
                query->Append("INSERT INTO project (code)VALUES '");
                query->Append(textBox1->Text);
                query->Append("'");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);
                oleDbDataAdapter1->Fill(dataSet11,"project");

ولي اگر fill رو غير فعال كنم تو label3 درست چاپ مي كنه اگه تست كنيد ممنون مي شم
با تشكر
 
آخرین ویرایش:

saalek110

Well-Known Member
من در این تاپیک تابحال از یک برنامه برای تست کدها استفاده کردم. که به زبانهای مختلفی کدش را نوشتم. (لینکها دو پست بالا تر.)
ولی حالا می خواهم برنامه دیگری را امتحان کنم که اینسرت و آپدیت و دیلت دارد. و همچنین پر کردن دیتاست بوسیله آداپتر.

البته این برنامه به سی شارپ است ولی در مرحله بعدی با وی سی ++ 2003 کار می کنم.
 

saalek110

Well-Known Member
سورس برنامه قبل فقط قادر بود برنامه دیتابیس را بخواند و نتیجه را چاپ کند ولی در سورس بعدی که از این سایت قابل دانلود است :
http://www.dotnetspider.com/tutorials/CRUDSample.aspx
ما قادر به تغییر دیتابیس خود نیز هستیم. ولی اساس کار فرقی ندارد و فقط کوئری تغییر می کند.

بعد دانلود سورس و دیتابیس همراه این سایت با باز کردن دیتابیس در اکسس تصویر زیر را خواهیم داشت:

a6.gif


که تنها تیبل موجود در دیتابیس را من باز کرده ام که 3 فیلد دارد شامل امپلوئی نامبر - نام - آدرس. و می بینید که سازنده مثل من بی حوصله بوده و در پر کردن این سه ردیف هم وقت نگذاشته و با حروف تکراری پر کرده.

پروژه این سایت با وی اس 2003 است . و بعد باز کردن با وی اس(ویژوال استودیو) 2005 بدون اشکال تبدیل می شود. ولی من می خواهم یک پروژه ویندوزی خالی باز کنم و از اول خودم بسازمش.
اسم پروژه را من tel_book می گذارم چون برای دفتر تلفن خیلی این پروژه مناسبه. شامل دو فیلد نام و شماره تلفن. ولی من در اینجا بخاطر تیبل موجود 3 فیلدی کار می کنم.
خوب پس یک پروژه بسازید و 4 باتون و 3 تکست باکس و 3 لیبل روی آن قرار دهید تا شروع کنیم.
من کپشن دکمه ها و لیبل ها را هم عوض میکنم تا بعد اجرای این فرم خالی از کد چنین شود:

a7.gif


بعد کدها را هم اضافه می کنم. یعنی از پروژه دانلود شده برای رویداد کلیک 4 دکمه کدش را پیست می کنم و یک تابع هم که دارد در انتها اضافه می کنم. حالا می ماند این که بروم فایل دیتابیس را هم داخل پوشه پروژه خودم کپی و پیست کنم. باید دو سطح بالاتر از پوشه بین-دیباگ پروژه من باشد چون در سورس چنین آدرس داده شده. حالا پروژه را اجرا می کنم.
و روی این خط خطا می گیرم:
کد:
OleDbConnection myConnection = new OleDbConnection(connectionString);
و دلیلش اینه که من یادم رفته یوزینگها را اضافه کنم. راه حلش ساده است. روی کلمه OleDbConnection یعنی نام کلاس ماوس را نگه دارید طبق شکل زیر می گوید چنین Type یا نیم اسپیسی وجود ندارد آیا اضافه کردن یوزینگ یا رفرنس را فراموش نکرده اید.

a8.gif


و بعد با کلیک روی نام کلاس داریم:

a9.gif

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

بعد باز با خطا روبرو می شوم به این علت که نام تکست باکس ها را عوض نکرده بودم که با کپی-پیست مشکل حل می شود. پس صفت name تکس باکسها را هم عوض کنید.
البته شما می توانید پروژه را دانلود کنید و بدون زحمت کار کنید. من به خاطر آموزش و تمرین دارم پروژه را از نو می سازم و شاید راههای ساده تری هم باشد برای این کار که به احتمال زیاد هست ولی فعلا من به شکل دستی کار می کنم.
برنامه این بار اجرا شد. و در دیتابیس هم نتایج ذخیره شد.

b1.gif

این هم کل کد فرم:
کد:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;


namespace tel_book
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (ValidateInputs() == false)
                return;

            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\Employee.mdb";

            OleDbConnection myConnection = new OleDbConnection(connectionString);
            myConnection.Open();

            int employeeNumber = int.Parse(txtEmployeeNumber.Text);
            string name = txtName.Text;
            string address = txtAddress.Text;
            string query = "insert into EMPLOYEE_TABLE (EmployeeNumber, Name, Address) VALUES (" + employeeNumber + ", '" + name + "', '" + address + "')";

            OleDbCommand myCommand = new OleDbCommand();
            myCommand.CommandText = query;
            myCommand.Connection = myConnection;
            myCommand.ExecuteNonQuery();

            myConnection.Close();

            MessageBox.Show("Created.");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (ValidateInputs() == false)
                return;

            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\Employee.mdb";

            OleDbConnection myConnection = new OleDbConnection(connectionString);
            myConnection.Open();

            int employeeNumber = int.Parse(txtEmployeeNumber.Text);
            string query = "delete from EMPLOYEE_TABLE where EmployeeNumber = " + employeeNumber;

            OleDbCommand myCommand = new OleDbCommand();
            myCommand.CommandText = query;
            myCommand.Connection = myConnection;
            myCommand.ExecuteNonQuery();

            myConnection.Close();


            MessageBox.Show("Deleted.");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (ValidateInputs() == false)
                return;

            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\Employee.mdb";

            OleDbConnection myConnection = new OleDbConnection(connectionString);
            myConnection.Open();

            int employeeNumber = int.Parse(txtEmployeeNumber.Text);
            string name = txtName.Text;
            string address = txtAddress.Text;
            string query = "update EMPLOYEE_TABLE set Name = '" + name + "', Address = '" + address + "' where EmployeeNumber = " + employeeNumber;

            OleDbCommand myCommand = new OleDbCommand();
            myCommand.CommandText = query;
            myCommand.Connection = myConnection;
            myCommand.ExecuteNonQuery();

            myConnection.Close();

            MessageBox.Show("Updated.");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\Employee.mdb";
            OleDbConnection myConnection = new OleDbConnection(connectionString);

            string query = "select * from EMPLOYEE_TABLE";

            OleDbDataAdapter myAdapter = new OleDbDataAdapter(query, myConnection);
            DataSet employeeData = new DataSet();
            myAdapter.Fill(employeeData);

            // Repeat for each table in the DataSet's table collection.
            foreach (DataTable table in employeeData.Tables)
            {
                // Repeat for each row in the table.
                foreach (DataRow row in table.Rows)
                {
                    MessageBox.Show("Employee Number : " + row["EmployeeNumber"].ToString());
                    MessageBox.Show("Name : " + row["Name"].ToString());
                    MessageBox.Show("Address : " + row["Address"].ToString());
                }
            }
        }

// ================================================
        private bool ValidateInputs()
        {
            try
            {
                int employeeNumber = int.Parse(txtEmployeeNumber.Text);
            }
            catch
            {
                // Failed to convert into number..
                MessageBox.Show("Please enter a valid number for employee number.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtEmployeeNumber.Focus();
                txtEmployeeNumber.Select();
                return false;
            }

            return true;
        }
    }
}

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

شرح برنامه:

ابتدا شرح این قسمت:
کد:
        private bool ValidateInputs()
        {
            try
            {
                int employeeNumber = int.Parse(txtEmployeeNumber.Text);
            }
            catch
            {
                // Failed to convert into number..
                MessageBox.Show("Please enter a valid number for employee number.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtEmployeeNumber.Focus();
                txtEmployeeNumber.Select();
                return false;
            }

            return true;
        }

این تابع توسط دکمه های اول تا سوم صدا می شود.
کلا کار این تابع این است که بررسی کند ببیند آیا کاربر در تکست باکسی که باید عدد وارد کند آیا عدد وارد کرده یا اشتباها حروف وارد کرده.
نوع آن پرویت است که یعنی توسط متدهای دیگر کلاس فقط قابل صدا زدن است. و خروجی bool دارد که یعنی یا درست برمی گرداند یا نادرست.
کلا باید بدانید داخل هر تابع صدا زده شده وقتی به ریترن می رسیم دیگر ادامه تابع دنبال نمی شود و با ریترن کردن کار تابع خاتمه می یابد.
این تابع اول try می کند (تلاش) برای تبدیل محتوای تکست باکس به عدد. اگر موفق شد می پرد از قسمت کچ و true برمیگرداند و اگر موفق نشود آنگاه قسمت کچ اجرا می شود و فالس برمی گرداند.
این طوری 3 دکمه می فهمند که کاربر درست عمل کرده یا نه.
دکمه چهارم کاری با محتوای تکست باکس ندارد و کارش اینه که تمام خانه های تیبل را چاپ کند.

==========================
حالا می رسیم به کار 3 دکمه اول(یک تا سه):

کار هر سه این است که یک کانکشن اول می سازند و بعد یک کوئری روی کانکشن اعمال می شود.
یعنی کلا این جوری میشه گفت به طور خلاصه که به دیتابیس وصل می شویم و آن را تغییر می دهیم.
در 3 دکمه کوئری ها متفاوت است. insert برای افزودن یک ردیف به تیبل و delete برای حذف یک ردیف و update برای تغییر یک ردیف.
در مورد update و دیلت با where ردیفهای مورد نظر را پیدا می کند. من الان یک تست کردم.
و آن این بود که من قبلا با دکمه اول 3 رکورد(ردیف) با نامبر یکسان در تیبل ایجاد کردم. و بعد با دستور حذف هر 3 حذف شدند .
یعنی اینکه هر چند ردیف که شرط where برقرار باشد روی آن ردیف ها عمل انجام می شود.

========================
در مورد دکمه چهارم باز ابتدا یک کانکشن ساخته می شود.
بعد یک آداپتر و یک دیتا ست ساخته می شود.
آداپتر کوئری را در خود دارد.
بعد آداپتر دیتاست را پر می کند.

As you already know, a DataSet can contain a collection of tables. But in our case, our sql statement will retrieve data from only one table. So, our DataSet will have only one table.
از همین سایتی که سورس را دانلود کردیم:
همان طور که می دانید یک دیتاست می تواند شامل تعدادی تیبل باشد ولی در مثال ما دستور sql باعث بازیابی یک تیبل است پس دیتاست ما فقط یک تیبل دارد.

بعد با فورایچ ها می آییم دیتاست را می خوانیم.
 
آخرین ویرایش:

saalek110

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

در این پست می خواهم برنامه پست قبل را که با سی شارپ 2005 بود را با وی سی ++ 2003 بنویسم.

ابتدا یک پروژه دات نت ویندوزی می سازم با نام access_query .
بعد using های مورد نیاز را استفاده می کنم.
کد:
using namespace System::Text;
using namespace System::Data::OleDb;

اولی برای استفاده از StringBuilder و دومی برای ایجاد کانکشن ها.(3 لیبل هم دلخواه.)

بعد 4 دکمه اضافه می کنم. و 3 تکست باکس.
صفت name تکست باکس ها را به :
txtEmployeeNumber
txtName
txtAddress

تغییر می دهیم.

در مورد تابع ValidateInputs(که در پست قبل موجود است) چون من با سینتکس وی سی آشنا نبودم آنرا حذف کردم.

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

این کد دکمه اول:
کد:
		String *connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Employee.mdb";

        OleDbConnection *myConnection = new OleDbConnection(connectionString);
            myConnection->Open();

			
            String *name = txtName->Text;
            String *address = txtAddress->Text;
            // in c-sharp // string query = "insert into EMPLOYEE_TABLE (EmployeeNumber, Name, Address) VALUES (" + employeeNumber + ", '" + name + "', '" + address + "')";
            StringBuilder* query = new StringBuilder();
            query->Append("insert into EMPLOYEE_TABLE (EmployeeNumber, Name, Address) VALUES (");
            query->Append(System::Int16::Parse(txtEmployeeNumber->Text));
            query->Append(", '");
			query->Append(name);
            query->Append("', '");
            query->Append(address);
            query->Append("')");
			
		
            OleDbCommand *myCommand = new OleDbCommand();
            myCommand->CommandText = query->ToString();
            myCommand->Connection = myConnection;
            myCommand->ExecuteNonQuery();

            myConnection->Close();

			MessageBox::Show("Created.");
این کد دکمه سوم:

کد:
		String *connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Employee.mdb";

        OleDbConnection *myConnection = new OleDbConnection(connectionString);
            myConnection->Open();

			
            String *name = txtName->Text;
            String *address = txtAddress->Text;
            //string query = "update EMPLOYEE_TABLE set Name = '" + name + "', Address = '" + address + "' where EmployeeNumber = " + employeeNumber;
            StringBuilder* query = new StringBuilder();
            query->Append("update EMPLOYEE_TABLE set Name = '");
            query->Append(name);
            query->Append("', Address = '");
			query->Append(address);
            query->Append("' where EmployeeNumber = ");
            query->Append(System::Int16::Parse(txtEmployeeNumber->Text));
			
            OleDbCommand *myCommand = new OleDbCommand();
            myCommand->CommandText = query->ToString();
            myCommand->Connection = myConnection;
            myCommand->ExecuteNonQuery();

            myConnection->Close();

			MessageBox::Show("Updated.");

کدهای بالا تست شد یعنی تغییرات مورد نظر را روی دیتابیس داد. بقیه دکمه ها را از برنامه پست قبل به سادگی می شود ساخت. پس ادامه ندادم.
 
آخرین ویرایش:

sara_she

Member
سلام
ممنونم بازم منو شرمنده كرديد
كد شما رو براي پروژه خودم به صورت زير تست كردم:

کد:
		        StringBuilder *query = new StringBuilder();
                query->Append("SELECT * FROM project WHERE code ='");
                query->Append(textBox1->Text);
                query->Append("'");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);
                oleDbDataAdapter1->Fill(dataSet11,"project");

insert
کد:
 query->Append("INSERT INTO project(code,title) VALUES ('");
                query->Append(textBox1->Text);
                query->Append("','");
			    query->Append(textBox2->Text);
                query->Append("')");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);

update
کد:
 query->Append("UPDATE project SET title='");
                query->Append(textBox2->Text);
                query->Append("'where code='");
			    query->Append(textBox1->Text);
                query->Append("'");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);

insert
کد:
  query->Append("DELETE FROM PROJECT WHERE Code ='");
            query->Append(textBox1->Text);
            query->Append("'");


راهنمايي شما بسار كارساز بود و كلي از مشكلات منو حل كرد بازم ممنونم

سوال ديگه كه برام پيش اومده در مورد ريختن مقادير يه ركورد خاص از بانك در تعدادي label‌است براي اين كار دو راه مي شناسم يكي استفاده از datareader‌و دومي توسط dataset و كمك گرفتن از datarow‌به صورتي كه بعد از پر كردن dataset با queryمورد نظر (select ) با حلقه for و datarow رديف به رديف جدول موجود در dataset رو چك مي كنيم و با if هر جا شرط برقرار بود فيلد هاي مورد نظر از dtarowرو تو label مي ريزيم البته اين روش براي زماني كه مي خواهيم چك كنيم مقدار خاصي هم براي يك فيلد خاص از بانك وجود دارد يا نه كاربرد دارد مثل چك كردن user
_name و password كه در vb.netبه شكل زير بود :
روش اول
SqlCommand * mySQL;
mySQL = new SqlCommand (S"select * from project where code=' " + textbox1.text + " ' ", mySQLConnection);
SqlDataReader * myReader;
myReader = mySQL->ExecuteReader ();
label1.text=myReader("code")'
label2.text=myReader("master_
name");
.
.
.
myReader.close()​

روش دوم :
کد:
dim row  as dararow

OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter("select * from project" ,oleDbConnection1);
 oleDbDataAdapter1->Fill(dataSet11,"project");

for each row in dataSet11.tables.rows 
 if row("code")=  textbox1.text  then
  label1.text=row("master_name");
  .
  .
  .
endif
next

اگه روش كار اين دو را در c++.net 2003 توضيح بدين ممنون مي شم
با تشكر
 

sara_she

Member
سلام
ممنونم بازم منو شرمنده كرديد
كد شما رو براي پروژه خودم به صورت زير تست كردم:

کد:
		        StringBuilder *query = new StringBuilder();
                query->Append("SELECT * FROM project WHERE code ='");
                query->Append(textBox1->Text);
                query->Append("'");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);
                oleDbDataAdapter1->Fill(dataSet11,"project");

insert
کد:
 query->Append("INSERT INTO project(code,title) VALUES ('");
                query->Append(textBox1->Text);
                query->Append("','");
			    query->Append(textBox2->Text);
                query->Append("')");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);

update
کد:
 query->Append("UPDATE project SET title='");
                query->Append(textBox2->Text);
                query->Append("'where code='");
			    query->Append(textBox1->Text);
                query->Append("'");
            
                label3->Text=query->ToString();
                OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter(query->ToString(),oleDbConnection1);

delete
کد:
  query->Append("DELETE FROM PROJECT WHERE Code ='");
            query->Append(textBox1->Text);
            query->Append("'");


راهنمايي شما بس يار كارساز بود و كلي از مشكلات منو حل كرد بازم ممنونم

سوال ديگه كه برام پيش اومده در مورد ريختن مقادير يه ركورد خاص از بانك در تعدادي label‌است براي اين كار دو راه مي شناسم يكي استفاده از datareader‌و دومي توسط dataset و كمك گرفتن از datarow‌به صورتي كه بعد از پر كردن dataset با queryمورد نظر (select ) با حلقه for و datarow رديف به رديف جدول موجود در dataset رو چك مي كنيم و با if هر جا شرط برقرار بود فيلد هاي مورد نظر از dtarowرو تو label مي ريزيم البته اين روش براي زماني كه مي خواهيم چك كنيم مقدار خاصي هم براي يك فيلد خاص از بانك وجود دارد يا نه كاربرد دارد مثل چك كردن user
_name و password كه در vb.netبه شكل زير بود :
روش اول
کد:
SqlCommand * mySQL;
mySQL = new SqlCommand (S"select * from project where code=' " + textbox1.text + " ' ", mySQLConnection);
SqlDataReader * myReader;
myReader = mySQL->ExecuteReader ();
label1.text=myReader("code")'
label2.text=myReader("master_
name");
.
.
.
myReader.close()[/

روش دوم :
کد:
dim row  as dararow

OleDbDataAdapter* oleDbDataAdapter1 = new OleDbDataAdapter("select * from project" ,oleDbConnection1);
 oleDbDataAdapter1->Fill(dataSet11,"project");

for each row in dataSet11.tables.rows 
 if row("code")=  textbox1.text  then
  label1.text=row("master_name");
  .
  .
  .
endif
next

اگه روش كار اين دو را در c++.net 2003 توضيح بدين ممنون مي شم
با تشكر
 

saalek110

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


یک کتاب الان از ایمول گرفتم با نام و مشخصات:

Microsoft Visual C++ .NET Step by Step, Version 2003
Microsoft .net
Julian Templeman
Andy Olsen
PUBLISHED BY
Microsoft Press
با حجم حدود 9 مگا. که فرصت شد آپلود می کنم.
می خواهم از سینتکس های آن استفاده کنم.

یکی از کدهای این کتاب این است:
کد:
1.	try
2.	{
3.	    // Open the database
4.	    cnNwind->Open();
5.	    Console::WriteLine(S"Connected to database successfully!");
6.	}
7.	catch (OleDbException * pe)
8.	{
9.	    Console::Write(S"Error occurred: ");
10.	    Console::WriteLine(pe->Message);
}

که ما به طور خلاصه تا بحال می نوشتیم:
کد:
1.	cnNwind->Open();

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

و باز از این کتاب این کد را نقل می کنم:
کد:
1.	// Close the connection
2.	if (cnNwind->State != ConnectionState::Closed)
3.	{
4.	    cnNwind->Close();
5.	}
6.	Console::WriteLine(S"The database connection is now closed");

فایده کد بالا هم این است که اول بررسی می کند که ببیند آیا کانکشن بسته شده یا نه. و بعد اقدام می کند.

و باز از این کتاب یک کوئری را می بینیم:
کد:
1.	// Query the database
2.	cmProducts->CommandText = 
        S"SELECT ProductName, UnitPrice FROM Products";

حرف s اینجا اضافه شده که فکر کنم در سینتکس وی سی ++ موجود است.

و همچنین باز از این کتاب داریم:
کد:
1.	Console::WriteLine(S"\n------------------------------------");
2.	while (reader->Read())
3.	{
4.	    Console::Write(reader->GetString(0));
5.	    Console::Write(S", ");
6.	    Console::WriteLine(reader->GetDecimal(1));
7.	}
8.	Console::WriteLine(S"--------------------------------------");

کد بالا قالب مفیدی برای خواندن از reader است. کاربردش را دقیق نمی دانم ولی فکر کنم دیدنش خط می دهد. مثل GetDecimal(1) که گویا مقدار دوم را(مقدار اولی GetString(0) است) با نوع دسیمال نمایش می دهد.

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

کد:
OleDbDataReader * reader = cmProducts->ExecuteReader();

کد:
reader->Close();

= = == = = = = = = = = = ==
عنوان فصل بعدی این کتاب هست:
Creating a Disconnected Application

که خود عنوان برایم جالب بود. گویا دو نوع روش کار است. که شما هم دو نوع ذکر کردید. یک نوع کانکتد است و دیگری دیسکانکتد.

این فصل کتاب را چون شکلهای مفیدی دارد را به شکل عکس نقل می کنم:

b4.GIF

b5.GIF



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

sara_she

Member
سلام دوباره
ممنون از مطالبي كه تو پست بالا گذاشتين .خيلي آموزنده بود . اگه كتاب رو برا دانلود بذارين ممنون ميشم فكر مي كنم جزئيات زيادي رو مورد بحث قرار داده.
در مورد ارتباط با ديتابيس به صورت disconnected فكر مي كنم اين امر نشاندهنده تفاوت بارز بين معماري ado و ado.net باشه چون در ADOبراي اجراي هر عملي در ارتباط با ديتابيس نياز داريم كه به آن connect‌باشيم در حالي كه در ado.net حداقل connection‌ نياز است و در همان ارتباط اول از طريق پر كردن dataset‌با قسمتي از بانك كه مد نظر است مي توانيم روي همين ديتاست كار كنيم و بعد تغييرات را به ديتابيس منتقل كنيم

در زير چند تفاوت از اين دو را بررسي مي كنيم:

معماری ‏ADO.NET‏ بگونه ای طراحی شده است که دارای کمترین ‏Connection‏ فعال باشد. در معماری ‏ADO.NET‏ ‏یک برنامه تنها زمانی که نیاز به خواندن و یا نوشتن اطلاعات داشته باشد، یک ‏Connection‏ را ایجاد می کند و پس از انجام ‏آن، ‏Connection‏ را از بین می برد. این کار باعث می شود که ‏Database‏ نیاز به نگهداری تعداد زیادی ‏Connection‏ ‏‏(که در بیشتر مواقع بصورت ‏Idle‏ می باشند) نداشته باشد و در نتیجه بتواند تعداد بسیار بیشتری از کاربران را سرویس دهی ‏کند.‏
ADO‏ و ‏ADO.NET‏ دارای تفاوت های متعددی با هم بوده و نمی توان ادعا نمود که ‏ADO.NET‏ کاملا" با ‏ADO‏ ‏سازگار است . ‏ADO.NET‏ دارای سه شی اساسی است : ‏DataSet ,DataReader‏ و ‏DataAdapter‏ . شی ‏DataSet‏ ‏را می توان با وضعيت ‏RecordSet‏ در ‏ADO‏ مقايسه نمود. ‏DataSet‏ مسدوليت ذخيره سازی داده ها در يک حافظه سريع ‏غير متصل (‏Disconnected Cashe‏) را بر عهده دارد. ساختار ‏DataSet‏ مشابه يک بانک اطلاعاتی رابطه ای است . از ‏DataReader‏ بمنظور بازيابی داده ها از بانک اطلاعاتی بصورت فقط خواندنی و فقط بسمت جلو ( اشاره گر مربوطه ) استفاده ‏می گردد. ‏DataAdapter‏ مجموعه ای از دستورات و ارتباطات به بانک اطلاعاتی را ارائه داده که از آنها بمنظور پر نمودن ‏Dataset‏ و بهنگام سازی داده ها در منابع داده ئی استفاده می گردد. در ‏ADO.NET‏ از دو ‏Data Provider‏ از قبل ‏تعريف شده استفاده می گردد : ‏SQLClient‏ و ‏OLEDB‏ . در صورتيکه از سرويس دهنده ‏SQL‏ استفاده می گردد ، می ‏بايست از ‏SQLClient‏ که بسيار سريع است ، استفاده گردد. ويژوال استوديو دات نت دارای امکانات متعدد طراحی بمنظور ‏دستيابی به بانک های اطلاعاتی و استفاده از اشياء ‏ADO.NET‏ است . در اين راستا می توان اشيائی نظير: ‏DataAdapter‏ ‏و ‏DataSet‏ را براحتی در يک فرم وب قرار داده و با پيکربندی مناسب آنها ، بسادگی زمينه بازيابی داده ها فراهم خواهد شد. ‏
برنامه نويسان ‏ASP‏ ، می بايست در رابطه با تبديل کدهای نوشته شده ‏ADO‏ در صفحات خود و تبديل آنها به ‏ADO.NET‏ اتخاذ تصميم نمايند. در صورت امکان توصيه می گردد که تمامی کدهای ‏ADO‏ به ‏ADO.NET‏ تبديل ‏شوند. در صورتيکه تحقق توصيه فوق بدلايلی غير ممکن بنظر می آيد ، می توان از يک لايه اضافی ديگر ‏COM Interop‏ ‏استفاده نمود که قطعا" باعث کاهش کارائی سيستم نيز خواهد شد. ‏

ADO‏ بر اساس معماري ‏Microsoft COM‏ با واسط هاي ‏OLE DB‏ بنا نهاده شده است، در حالي كه ‏ADO.NET‏ بر ‏اساس معماري ‏Microsoft.NET‏ و مشخصأ واسطهاي ‏ADO.NET‏ بنا نهاده شده است. از آنجائيكه معماري .‏NET‏ كاملأ ‏با معماري ‏COM‏ متفاوت مي باشد، واسطهاي ‏ADO.NET‏ كاملأ متفاوت از واسطهاي ‏ADO‏ و ‏OLE DB‏ مي باشند. ‏اين در ضمن بدين معني است كه ‏Data Provider‏ هاي ‏ADO.NET‏ كاملأ با ‏Data Provider‏ هاي ‏ADO‏ متفاوت ‏مي باشند.


اگه جواب پست قبل منو پيدا كرديد ممنون مي شم راهنماييم كنيد
 
آخرین ویرایش:

saalek110

Well-Known Member
من کتاب ado.net زیاد دارم. به دنبال سینتکس سی پلاس بودم داخل آنها ولی بیشتر برای وی بی دات نت و سی شارپ است.
اما در مورد کتابهایی که برای سی + دات نت بود و نه ado.net مثل همه زبانها فقط یک فصل را به دیتابیس اختصاص داده و معمولا خیلی کم به آن پرداخته. در مورد کتاب بالا هم در مورد دیتابیس هر چه داشت را من نقل کردم. البته اگر کتاب را خواستید بگویید آپلود می کنم .
اصلا بگذارید آپلود کنم تا خودتان تصمیم بگیرید. حجمش 9 مگا است و 4 صفحه راجع به دیتابیس دارد که 2 صفحه را نقل کردم.
http://rapidshare.com/files/34247439/MicroSoft_vc2003_StepByStep.rar.html
 
آخرین ویرایش:

saalek110

Well-Known Member
روش اول
کد:
SqlCommand * mySQL;
mySQL = new SqlCommand (S"select * from project where code=' " + textbox1.text + " ' ", mySQLConnection);
SqlDataReader * myReader;
myReader = mySQL->ExecuteReader ();
label1.text=myReader("code")'
label2.text=myReader("master_
name");
.
.
.
myReader.close()[/

برنامه بالا به زبان وی بی دات نت بود. من در زیر به سی پلاس دات نت تبدیل کردم.
البته به جای SqlDataReader از OleDbDataReader استفاده کردم.
و به جای SqlCommand از OleDbCommand استفاده کردم.



مسئله: می خواهیم از دیتابیس مقادیری را بخوانیم و در لیبل ها(مقایسه ستونی با محتوای تکست باکس) نمایش دهیم.
زبان : ویژوال سی ++ دات نت 2003
دانلود دیتابیس از :
http://www.hammerdata.com/Google/ClassProjects.mdb
حجم دیتابیس که باید دانلود شود: 300 کیلو.

باید using های زیر افزوده شود:
کد:
using namespace System::Text;
using namespace System::Data::OleDb;
اولی برای استفاده از StringBuilder و دومی برای ایجاد کانکشن ها.

ابزارهای روی فرم : یک دکمه و یک تکست باکس و چند لیبل.


کد:
	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
			 {
		 String *connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\ClassProjects.mdb";      
		 OleDbConnection *myConnection = new OleDbConnection(connectionString);

         myConnection->Open();
         
          StringBuilder* query = new StringBuilder();
          query->Append("select * from PROJECT where Code= '");
          query->Append(textBox1->Text);
          query->Append(" ' ");
		
           OleDbCommand *myCommand = new OleDbCommand();
           myCommand->CommandText = query->ToString();
           myCommand->Connection = myConnection;
        
		   OleDbDataReader *myOleDbDataReader = myCommand->ExecuteReader();
	         myOleDbDataReader->Read();
          
		   label1->Text=myOleDbDataReader->get_Item(0)->ToString();
               label2->Text=myOleDbDataReader->get_Item(1)->ToString();
		   label3->Text=myOleDbDataReader->get_Item(2)->ToString();
               label4->Text=myOleDbDataReader->get_Item(3)->ToString();

		   myOleDbDataReader->Read();

		   label5->Text=myOleDbDataReader->get_Item(0)->ToString();
               label6->Text=myOleDbDataReader->get_Item(1)->ToString();
		   label7->Text=myOleDbDataReader->get_Item(2)->ToString();
               label8->Text=myOleDbDataReader->get_Item(3)->ToString();
         myConnection->Close();

			 }
myOleDbDataReader->Close();
 myConnection->Close();


c1.gif


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

این کد :

کد:
while (rdr.Read())
{
  Console.WriteLine(rdr[0]);
}
شاید مفید باشد. از :
Pragmatic ADO.NET: Data Access for the Internet World
By Shawn Wildermuth

Publisher : Addison Wesley
 
آخرین ویرایش:

saalek110

Well-Known Member

b6.gif




b7.gif


The DataReader
The DataReader is ADO.NET's answer to the connected recordset in ADO. However, the DataReader is
forward-only and read-only – we can't navigate through it at random, and we can't use it to update the data source. It
therefore allows extremely fast access to data that we just want to iterate through once, and it is recommended to use
the DataReader (rather than the DataSet) wherever possible. A DataReader can only be returned from a call
to the ExecuteReader method of a command object; we can't instantiate it directly. This forces us to instantiate a
command object explicitly, unlike in ADO, where we could retrieve a Recordset object without ever explicitly
creating a Command object. This makes the ADO.NET object model more transparent than the "flat" hierarchy of
ADO.

The DataAdapter
The last main component of the .NET data provider is the DataAdapter. The DataAdapter acts as a bridge
between the disconnected DataSet and the data source. It exposes two interfaces; the first of these,
IDataAdapter, defines methods for populating a DataSet with data from the data source, and for updating the
data source with changes made to the DataSet on the client. The second interface, IDbDataAdapter, defines
four properties, each of type IDbCommand. These properties each set or return a command object specifying the
command to be executed when the data source is to be queried or updated
:


b8.gif



Note that an error will be generated if we attempt to update a data source and the correct command hasn't been
specified. For example, if we try to call Update for a DataSet where a new row has been added, and don't
specify an InsertCommand for the DataAdapter, we will get this error message:
Unhandled Exception: System.InvalidOperationException: Update requires a valid
InsertCommand when passed DataRow collection with new rows.
We'll look briefly at how we avoid this error when we discuss the DataSet.

The DataSet
The other major component of ADO.NET is the DataSet; this corresponds very roughly to the ADO
recordset. It differs, however, in two important respects. The first of these is that the DataSet is always
disconnected, and as a consequence doesn't care where the data comes from – the DataSet can be used in
exactly the same way to manipulate data from a traditional data source or from an XML document. In order to
connect a DataSet to a data source, we need to use the DataAdapter as an intermediary between the
DataSet and the .NET data provider:

b9.gif


For example, to populate a DataSet with data from the Employees table in the Northwind database:
کد:
// Open the connection
OleDbConnection cn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\NWind.mdb");
cn.Open();
// Create a new DataAdapter object, passing in the SELECT command
OleDbDataAdapter da = new OleDbDataAdapter(
"SELECT EmployeeID, FirstName, LastName FROM Employees", cn);
// Create a new DataSet
DataSet ds = new DataSet();
// Fill the DataSet
da.Fill(ds, "Employees");
// Close the connection now we've got the data
cn.Close();

After opening the connection just as we did before, there are three steps involved to populating the DataSet:
Instantiate a new DataAdapter object. Before we fill the DataSet, we'll obviously need to
specify the connection information and the data we want to fill it with. There are a number of ways
of doing that, but probably the easiest is to pass the command text for the SQL query and either a
connection string or an open connection into the DataAdapter's constructor, as we do above.
Create the new DataSet.
Call the DataAdapter's Fill method. We pass the DataSet we want to populate as a parameter
to this method, and also the name of the table within the DataSet we want to fill. If we call the
Fill method against a closed connection, the connection will automatically be opened, and then reclosed
when the DataSet has been filled.

حجم مورد دانلود : حدود 7 مگا.
حجم فایل آنزیپ شده : حدود 9 مگا.

محیط 2003 . البته سینتکس سی پلاس دات نت خیلی کم دارد(چند مورد معدود) ولی مطمئنا کتاب مفیدی است.

لینک دانلود:
http://rapidshare.com/files/34294796/Prf_ADO_Net_Prg.rar.html

فهرست:
کد:
Table of Contents
Introduction 1
What Is ADO.NET? 1
What Does This Book Cover? 1
Who Is This Book For? 3
What You Need To Use This Book 3
Conventions 3
Customer Support 4
How to Download the Sample Code for the Book 4
Errata 4
E- mail Support 4
p2p.wrox.com 5
Why this System Offers the Best Support 6
Chapter 1: Data Access and .NET 9
The .NET Framework 9
The Common Language Runtime 10
Garbage Collection 11
The Common Language Infrastructure 11
Assemblies 11
The Common Type System 12
The Common Language Specification 12
.NET Class Libraries 12
Not Another Data Access Technology? 13
Brief History of Data Access 13
ODBC 13
DAO 13
RDO 14
OLE DB 14
ADO 14
Introduction to ADO.NET 15
Advantages of Using Managed Classes 15
Cross-Language Support 15
Cleaner Architecture 15
XML Support 15
Optimized Object Model 16
Table of Contents
ii
Architectural Overview of ADO.NET 16
.NET Data Providers 16
Data Provider Components 16
Existing Data Providers 19
The DataSet 21
The DataTable Class 23
Updating the Data Source 24
ADO.NET and XML 25
Typed DataSets 27
ADO.NET and ADO 2.6 28
Disconnected Data Access 29
Read-Only, Forward-Only Access 30
Provider-Specific Classes 31
Using ADO 2.x in .NET 34
Using ADO.NET 36
C# Example 36
Visual Basic.NET Example 36
JScript.NET Example 37
Managed C++ Example 38
J# Example 39
ADO.NET Events 40
Summary 42
Chapter 2: The .NET Data Providers 45
The SQL Server Data Provider 46
The OLE DB Data Provider 47
Meet the Players 47
Connection 48
Command 49
DataReader 49
DataAdapter 52
Establishing Connections 53
The SqlConnection and OleDbConnection Classes 53
Constructing a Connection 53
Storing Connection Strings in the Configuration File 54
Connection Events 56
Connection Pooling in the Data Providers 58
Using Commands 59
The SqlCommand and OleDbCommand Classes 59
Using a Command with a T-SQL Statement 59
Executing the Command 60
Using a Command with a Stored Procedure 63
Using the SqlParameter and OleDbParameter Classes 64
Summary 67
Table of Contents
iii
Chapter 3: Visual Studio .NET and ADO.NET 69
Connection Classes 70
SqlConnection and OleDbConnection Data Components 70
Adding the Connection String 72
Retrieving Connection Strings Programmatically 76
Adding an Event 77
Command Data Components 79
SqlCommand and OledbCommand Data Components 80
Defining a Query Command 81
Executing a Stored Procedure 87
Data Adapter Components 91
Table Mappings 101
DataSet Data Component 103
The Typed Dataset 104
Adding a Typed Dataset to the Project 104
Relating Two or More Tables 108
Generating and Filling a Typed DataSet Object 110
Using the Techniques Acquired to Create a Web Service 112
The DataView Data Component 116
Using the DataView to View Selected Rows 117
Filtering Rows Using a Filter Expression 117
Filtering Rows on Row State 118
Using the DataView to Sort Rows 119
The DataGrid Component 120
DataGrid Web Component 120
Binding the DataGrid Component to a Data Source 120
Formatting the DataGrid 122
Sorting DataGrid Records 125
Selecting, Editing, Updating, and Deleting DataGrid Records 125
Breaking a DataGrid into Pages 128
DataGrid Window Component 129
Summary 130
Chapter 4: Using DataReaders 133
A Note About the Chapter Contents 134
The Basics of a DataReader 135
The IDataReader Interface 135
The IDataRecord Interface 135
The ADO.NET DataReaders 136
DataReader Operations 138
Creating a DataReader 139
The ExecuteReader Method 139
Creating and Using a DataReader 140
Table of Contents
iv
Simple Data Retrieval With the DataReader 141
Executing Stored Procedures with a DataReader 143
Navigating Multiple Result Sets 147
Accessing the Data in a Type-Safe Manner 148
SQL Server Types 150
Getting the Result Set's Schema 151
Bringing it all Together 153
Commonly Encountered Exceptions 157
IndexOutOfBoundsException 157
InvalidOperationException 158
DataReader Performance Considerations 158
Column Ordinal versus Column Name 159
Type Safe Access versus Non-Type-Safe Access 160
Summary 161
Chapter 5: The DataSet 163
The DataTable 164
DataColumn 165
DataRow 166
Constraints 166
Primary Key 167
Dynamically Constructing a DataTable 168
DataTable Events 169
DataTable Events Example 170
Populating a DataSet 180
Constructing a DataAdapter 181
Invoking Fill 182
DataAdapter Example 183
The Tables Collection 185
Populating the Tables Collection with Multiple DataTables 185
Multiple DataSet Tables Example 186
Retrieving the Tables Collection Metadata 188
The Relations Collection 190
DataRelations Example 192
Merging DataSets 197
Merging Two DataSets 198
Merging Two DataSets and Maintaining Original Values 198
Merging Two DataSets with Different Schemas 198
Caching DataSets for Better Performance 199
Summary 204
Table of Contents
v
Chapter 6: Using the DataAdapter 207
The DataAdapter Base Class 207
DataAdapter and DataSet 208
More Details for the Fill Method 212
Using More Complex Queries 213
Filling a DataSet Object with Few Records 217
Filling a DataSet Object with Only the Schema 219
Filling a DataSet Object that Already has a Schema 222
Updating a Database 222
Using a CommandBuilder Object 223
Using SQL Commands 225
Making Updates Using Stored Procedures 228
The DataAdapter's Events 230
Summary 232
Chapter 7: Typed DataSets and DataSet Schemas 235
Overview of XSD 236
Simple Types 236
Basic Data Types 236
Attributes 238
Enumerations 239
User-Defined Types 240
Facets 240
Complex Types 241
Mixed Attribute 241
Element Groups 242
ll Element 242
choice Element 242
sequence Element 243
group Element 243
Attribute Groups 244
XSD Annotation 244
documentation Element 245
appinfo Element 245
XmlSchema Class 245
DataSet Schemas 247
Schema Translation 247
Generating Tables and Columns 248
Constraints 250
Keys 250
Unique Constraints 250
Foreign Keys (Keyrefs) and Relationships 250
Typed DataSets 254
Building Strongly Typed DataSets in Visual Studio .NET 255
Building Typed DataSets Manually 259
Strongly Typed DataSets and Relational Data 260
Typed DataSet Performance 262
Table of Contents
vi
Annotating Typed DataSets 262
codegen 263
typedName 263
typedPlural 263
typedParent 263
typedChildren 263
nullValue 263
msdata 264
ConstraintName 264
ConstraintOnly 264
UpdateRule 264
DeleteRule 264
PrimaryKey 264
Relationship 264
Annotated Typed DataSet Example 265
Summary 268
Chapter 8: XML and the DataSet 271
XmlDocument (W3C DOM) 272
XPath 275
Axis 276
Node Test 277
Predicate 277
DataSet Schemas 280
Schema Inference 280
Inference Rules 280
Inference Rules in Action 281
Supplied Schemas 285
Document Validation with Schemas 286
XmlValidatingReader 286
DataSets and XML Data 289
Loading XML 289
XmlReadMode 290
Writing XML 291
Fidelity Loss and DataSet Schemas 293
DataSet Marshaling 295
DataSet Serialization 295
Transferring DataSet XML Between Applications 295
Data Filtering 299
Select Method 300
Data Views 303
The DataSet and the XmlDataDocument 305
Relational Projection of DOM View via XSD 306
Relational Projection Views with a Typed DataSet 309
Using XSL and XSLT Transformations 310
Summary 314
Table of Contents
vii
Chapter 9: Constraints, Relations, and Views 317
Constraints 318
Unique Constraint 319
ForeignKeyConstraint 321
Custom Constraint 326
DataRelations 333
XML and DataRelations 337
DataViews 340
Sorting 341
Filtering 343
Operators 344
Relationship Referencing 344
Aggregate Functions 345
Functions 346
Filtering on Row State 346
Editing Data in the DataView 348
DataViewManager 349
Databinding 350
Bringing it Together 352
Examples 354
Example 1 354
Example 2 357
Summary 362
Chapter 10: Transactions 365
What is a Transaction? 365
ACID Properties 366
Database Transactions 366
Transaction Vocabulary 367
ADO.NET Transaction Support 367
Transaction Class 369
Methods of the Transaction class 369
Writing Transactional Database Applications 370
Implementing Transactions 370
Running the Application 373
Examining the Effect of Isolation Level 373
What are Isolation Levels? 374
Some Related Terms 374
Possible Isolation Levels in ADO.NET 374
Changing Isolation Levels 375
When to Use Transactions 377
Transactions and Performance 378
Default Behavior for Transactions 378
Transactions and User Confirmation 378
Simultaneous ADO.NET and DBMS Transactions 379
Table of Contents
viii
Advanced Techniques 379
Savepoints 379
Nested Transactions 382
Using Transactions with a DataSet and DataAdapter 382
Summary 384
Chapter 11: Mapping 387
Using the SQL AS Keyword 387
The ADO.NET Mapping Mechanism 389
Using Mapping when Retrieving Data 389
The MissingMappingAction and MissingSchemaAction Properties 392
Inserting Records Using Mapped Names 393
Web Services with Mapping 396
Creating the Supplier Database 398
Creating the Supplier Web Service 400
Creating the Pet Lovers Application 401
Summary 406
Chapter 12: Making a Data Services Component 409
Installing ODBC .NET 410
What is a Data Service Component and Why Use it? 411
What is the Data Servic e Component? 411
What are the Benefits? 412
Creating a Data Service Component 413
The Data Service Component 413
The DataLayer Namespace – Public Enumerators 414
The ConfigSettings Class – Public Properties 415
The ConfigSettings Class – Public Constructors 416
The Commands Class – Public ExecuteQuery Method 418
The Commands Class – Public ExecuteNonQuery Method 422
The Commands Class – Private Connection Method 422
Creating an Assembly Information File 423
Compiling the Data Service Component 424
Deploying a Data Service Component 425
The Global Assembly Cache – (GAC) 425
Making a Reference to Wrox_DL in machine.config 428
Using the Data Service Component 428
Using in a ASP.NET Web Form 429
Executing SQL Text 429
Executing Stored Procedures 435
Using in a Web Service 438
Table of Contents
ix
Performance and Optimization Tips 440
Object Pooling 440
Building a Hit Tracker Component 441
Transactions 448
Uninstalling the Components 452
Summary 453
Chapter 13: ADO.NET and Web Services 455
Setting Up the Code Samples 456
Web Services – The New DCOM 458
Common Standards 458
Supply and Demand – Web Service Providers and Consumers 459
Building a Basic Web Service 460
Building a Basic Consumer 465
Building an HTTP Consumer 466
Capturing the Data in an XmlDocument 469
Build a SOAP Consumer in Visual Studio .NET 471
Discovering Web Services 472
Building the Consumer Code Behind Class 477
What is a Proxy Client? 480
The WSDL.exe Utility 482
Storing a Web Service URL in a Configuration File 484
Exchanging Data in Web Services 485
Working with DataSets 486
Building a Pre-populated DataSet Derived Class 486
Building the Web Service Method 488
Building a Windows Form Consumer with Visual Studio .NET 489
Running the Windows Form Project 491
DataSets as Input Arguments 491
Building a Web Form Consumer 493
Using XML with Web Services 498
Working with Custom Classes as XML 499
Working with XML Attributes 503
Working with XML Elements and Attributes 504
Working with Multiple Custom Classes As XML 505
Web Service Security 506
Using Windows Authentication 507
Adding Credentials to a Consumer 507
Using SOAP-based Authentication 508
Building a Private Web Service 509
Building the Consumer 511
Summary 514
Table of Contents
x
Chapter 14: SQL Server Native XML Support 517
FOR XML 518
FOR XML – Optional Arguments 521
FOR XML RAW 522
Using FOR XML RAW with ADO.NET 523
FOR XML AUTO 525
FOR XML AUTO and ADO.NET 527
FOR XML EXPLICIT 529
FOR XML EXPLICIT – Two-Level Example 531
Entity Encoding 532
Directives 533
FOR XML EXPLICIT – Three-Level Example 536
FOR XML EXPLICIT – ADO.NET 539
FOR XML EXPLICIT – Conclusion 541
OPENXML 541
OPENXML Stored Procedures: Deletion and Updates 544
OPENXML ADO.NET: Insertion, Deletion, and Updates 545
Summary 547
Chapter 15: Performance and Security 551
Optimizing Data Access 551
DataReader or DataSet? 552
Memory Consumption 552
Traversal Direction 552
Multiple Result Sets 553
Round Trips 553
Stored Procedures 554
Compiled Query Caching 555
Configuring DataAdapter Commands 555
High-Volume Data Processing 559
Latency 559
Cached Data 560
ASP.NET Object Caching 564
Birds of a Feather (Functionality Grouping) 567
Marshaling Considerations 568
DataSet Serialization 569
XML over HTTP 571
Connection Pooling 571
SqlConnection 572
OleDbConnection 572
Message Queuing 573
To Queue or Not to Queue 573
Sending Messages 574
Receiving Messages 575
Table of Contents
xi
Security Concerns 576
Code Access Security 576
Administration 577
Code Groups 577
Permission Sets 578
Permissions 578
CAS in Action 579
SSL 583
Encryption 584
Summary 586
Chapter 16: Integration and Migration 589
InterOp 590
COM InterOp and the RCW 590
Accessing ADO from .NET 590
Whether to Access ADO from .NET 590
Accessing ADO from .NET 591
Platform Invocation Services (PInvoke) 594
Migration 595
ADO Data Types 596
Migrating Connections 597
Migrating the Recordset 599
Forward-Only Data Access 600
Publishing RecordSet Changes 603
Migrating Commands and Stored Procedures 609
Changes in XML Persistence 615
Handling Exceptions and Errors 618
Streams 620
Summary 622
Chapter 17: Creating a Custom .NET Data Provider 625
Data Provider Library 626
Application Requirements 626
Retail Store 626
E-Commerce Site 627
Telephone Sales 627
Architecture and Design 627
Distributed Order Entry System 628
The Order Class and Schema 629
A Sample Order 629
Implementing the Data Provider Assembly 630
The OQProvider Namespace 630
The OrderObject 631
The OrderItem 634
Table of Contents
xii
An MSMQ Review 636
Sending Messages 636
Receiving Messages 638
The OQConnection 638
The OQCommand 643
The OQParameterCollection and OQParameter 648
The OQDataReader 652
The OQDataAdapter 657
The OQException 663
Utilizing the Custom Data Provider 663
A Retail Store Interface 664
An E-Commerce Web Site Interface 665
The Telephone Sales Interface 667
Summary 669
Chapter 18: Case Study – Cycle Couriers 671
Requirements 673
Customer 674
Recipient (Addressee) 674
Cyclist 674
Call Center Operator 675
Design 675
User Interface Layer 676
The Customers View 677
The Cyclist View 679
The Call Center Operator View 679
Business Layer 681
Customer 681
Package 681
Cyclist 681
User Authentication 682
Package Status Change 682
Data layer 682
Implementation 683
Database Detail 683
Customers 683
Cyclists Table 684
CyclistStates Table 684
Packages Table 684
Relationships 686
Class Description 686
ServiceCustomer 687
ServicePackage 689
ServiceCyclist 692
Web Interface classes 693
Call Center Operator Application 696
Hardware Configuration 699
Table of Contents
xiii
How to Deploy the System 700
Installing the Web Application and Web Service 700
Installing the Client – Call Center Application. 702
How to Build the System 703
Summary 704
Index 707
 
آخرین ویرایش:

saalek110

Well-Known Member
آخرین ویرایش:

sara_she

Member
سلام
ممنون از راهنمايي شما ولي دو لينكي كه از rapidshare‌ بودن نتونستم بگيرم وارد قسمت upload مي شدند

از كدي كه با datareader گذاشتين ممنونم امروز تستش مي كنم .اگه نمونه دوم كه با dataset بود رو هم پيدا كردين منو در جريان بذارين

راستي سوالي هم در يه تاپيك ديگه درمورد سفادشي كردن datagrid گذاشتم اگر براتون امكان داره منو راهنمايي كنيد

ممنون و موفق باشيد
 

saalek110

Well-Known Member
سلام. دولینک رپیدشیر را الان امتحان کردم. هر دو درست بود . یعنی با زدن دکمه free در پایین صفحه به صفحه دانلود می رفت.ولی شاید برای شما این طور باشد.
دومی هم کمی کار کردم. مشکلی نداره.
راجع به دیتاگرد هم فکر کنم راحت بشه شخصی کرد. کار می کنم باز.
 
آخرین ویرایش:

saalek110

Well-Known Member
به نقل از :
http://dotnetsource.com/fa/forum/default.aspx?g=posts&t=18
از جناب بابک زواری
يک فايل PDF حاوي اطلاعات جامع و سريع راجع به ADO.Net

http://rapidshare.com/files/17266700/ADO.pdf.htm
یک pdf صد کیلویی فارسی راجع به متدها و .. در ADO.Net است. فکر کم خیلی مفید باشه.

من اینجا هم آپلود کردم. به نظرم راهنمای مفیدی است.

روی کلمه اینجا کلیک راست کنید و save target as را بزنید.
 
آخرین ویرایش:

sara_she

Member
بازم سلام از لينكي كه به عنوان sample گذاشته بوديد ممنون
كد شما رو به شكل زير تغيير داده و تست كردم"
کد:
 StringBuilder* query = new StringBuilder();
           query->Append("select * from PROJECT where Code= '");
          query->Append(textBox4->Text);
          query->Append(" ' ");
		
           [COLOR="Red"]OleDbCommand *myCommand = new OleDbCommand(query->ToString(),oleDbConnection1);[/COLOR]
			  // OleDbCommand();
          // myCommand->CommandText = query->ToString();
           //myCommand->Connection = myConnection;
        
		     OleDbDataReader *myOleDbDataReader = myCommand->ExecuteReader();
	         
[COLOR="red"]			   if (myOleDbDataReader->Read())[/COLOR]
			   {
		        textBox1->Text=myOleDbDataReader->get_Item(0)->ToString();
                textBox2->Text=myOleDbDataReader->get_Item(1)->ToString();
		        textBox3->Text=myOleDbDataReader->get_Item(2)->ToString();
               //label2->Text=textBox4->Text;
			  // textBox4->Visible=false;
			 //label2->Visible=true;
            [COLOR="red"]   myOleDbDataReader->Close();[/COLOR]
			   }
			   else{
				    //label2->Visible=true;
					//label2->Text="not found this code...";
			   }

جواب داد
اگه myOleDbDataReader->Close رو ننويسيم بار دوم كه رو دكمه مورد نظر كليك مي كنيم چون از قبل reader باز بوده خطا مي گيرد
با تشكر
 
آخرین ویرایش:

saalek110

Well-Known Member
من close را در رویداد دکمه داشتم ولی موقع کپی پیست جا افتاده. در پست آن اضافه کردم.
در کد شما آخرین رکورد در لیبلها نمایش داده می شود. یا باید به کاربر دکمه ای داد تا به ترتیب در لیبل ها نتیجه را مشاهده کند یا محدوده نمایش را دارای ظرفیت نمایش رکوردهای بیشتری کرد. من به همین خاطر دو سری لیبل گذاشته بودم.

c1.gif


تازه فهمیدم. شما ریدر را می گفتید نه کانکشن. هر دو را کلوز کردم.
 
آخرین ویرایش:

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

بالا