سورس برنامه قبل فقط قادر بود برنامه دیتابیس را بخواند و نتیجه را چاپ کند ولی در سورس بعدی که از این سایت قابل دانلود است :
http://www.dotnetspider.com/tutorials/CRUDSample.aspx
ما قادر به تغییر دیتابیس خود نیز هستیم. ولی اساس کار فرقی ندارد و فقط کوئری تغییر می کند.
بعد دانلود سورس و دیتابیس همراه این سایت با باز کردن دیتابیس در اکسس تصویر زیر را خواهیم داشت:
که تنها تیبل موجود در دیتابیس را من باز کرده ام که 3 فیلد دارد شامل امپلوئی نامبر - نام - آدرس. و می بینید که سازنده مثل من بی حوصله بوده و در پر کردن این سه ردیف هم وقت نگذاشته و با حروف تکراری پر کرده.
پروژه این سایت با وی اس 2003 است . و بعد باز کردن با وی اس(ویژوال استودیو) 2005 بدون اشکال تبدیل می شود. ولی من می خواهم یک پروژه ویندوزی خالی باز کنم و از اول خودم بسازمش.
اسم پروژه را من tel_book می گذارم چون برای دفتر تلفن خیلی این پروژه مناسبه. شامل دو فیلد نام و شماره تلفن. ولی من در اینجا بخاطر تیبل موجود 3 فیلدی کار می کنم.
خوب پس یک پروژه بسازید و 4 باتون و 3 تکست باکس و 3 لیبل روی آن قرار دهید تا شروع کنیم.
من کپشن دکمه ها و لیبل ها را هم عوض میکنم تا بعد اجرای این فرم خالی از کد چنین شود:
بعد کدها را هم اضافه می کنم. یعنی از پروژه دانلود شده برای رویداد کلیک 4 دکمه کدش را پیست می کنم و یک تابع هم که دارد در انتها اضافه می کنم. حالا می ماند این که بروم فایل دیتابیس را هم داخل پوشه پروژه خودم کپی و پیست کنم. باید دو سطح بالاتر از پوشه بین-دیباگ پروژه من باشد چون در سورس چنین آدرس داده شده. حالا پروژه را اجرا می کنم.
و روی این خط خطا می گیرم:
کد:
OleDbConnection myConnection = new OleDbConnection(connectionString);
و دلیلش اینه که من یادم رفته یوزینگها را اضافه کنم. راه حلش ساده است. روی کلمه OleDbConnection یعنی نام کلاس ماوس را نگه دارید طبق شکل زیر می گوید چنین Type یا نیم اسپیسی وجود ندارد آیا اضافه کردن یوزینگ یا رفرنس را فراموش نکرده اید.
و بعد با کلیک روی نام کلاس داریم:
که دو راه را پیشنهاد می کند. که یکی افزودن یوزینگ مورد نیاز یا کامل نوشتن مسیر کلاس است. که با کلیک هر یک مشکل برنامه حل می شود.
بعد باز با خطا روبرو می شوم به این علت که نام تکست باکس ها را عوض نکرده بودم که با کپی-پیست مشکل حل می شود. پس صفت name تکس باکسها را هم عوض کنید.
البته شما می توانید پروژه را دانلود کنید و بدون زحمت کار کنید. من به خاطر آموزش و تمرین دارم پروژه را از نو می سازم و شاید راههای ساده تری هم باشد برای این کار که به احتمال زیاد هست ولی فعلا من به شکل دستی کار می کنم.
برنامه این بار اجرا شد. و در دیتابیس هم نتایج ذخیره شد.
این هم کل کد فرم:
کد:
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 باعث بازیابی یک تیبل است پس دیتاست ما فقط یک تیبل دارد.
بعد با فورایچ ها می آییم دیتاست را می خوانیم.