انجام عملیات CRUD اطلاعات در بانک اکسس

در این پست با استفاده از بانک اطلاعاتی مایکروسافت اکسس و زبان برنامه نویسی ویژوال سی شارپ عملیات های اصلی انتخاب ، درج ، حذف و ویرایش اطلاعات (Create , Read,Update,Delete یا CRUD) را روی یک جدول انجام می دهیم . در این آموزش از مایکروسافت اکسس 2007 و ویزوال استودیو 2015 استفاده می کنیم . در شروع کار برنامه مایکروسافت اکسس را باز کنید و بر روی New کلیک کنید .

crud-access-csharp (1)

سپس بر روی آیکن پوشه در سمت راست کلیک کنید تا تنظیمات بیشتری را بر روی فایل بانک اطلاعاتی انجام دهید .
crud-access-csharp (2)

در پنجره ی محاوره ای باز شده کارهای زیر را انجام دهید :

  1. ابتدا Desktop را برای مکان ذخیره سازی فایل بانک اطلاعاتی خود انتخاب کنید (این قسمت اختیاری می باشدو شما می توانید یک مکان دیگر را نیز انتخاب کنید)
  2. در فیلد File Name کلمه ی sampleDB را به عنوان نام بانک تایپ کنید
  3. در قسمت Save As Type  گزینه ی Microsoft Office Access Database (2002-2003)  را انتخاب کنید
  4. OK را کلیک کنید

crud-access-csharp (3)

سپس بر روی دکمه Create کلیک کنید تا فایل بانک اطلاعاتی شما در مسیر مورد نظر ، با نام و فرمت انتخاب شده توسط شما ایجاد شود
crud-access-csharp (4)

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

حالا باید برای جدول فیلدهای آن را تعیین کنیم :

  1. فیلد ID را بدون دست کاری رها کنید (در اواخر آموزش از این فیلد برای عملیات های حذف و ویرایش اطلاعات استفاده خواهیم کرد)
  2. فیلد دوم را Name نامگذاری کنید . با این کار به صورت پیش فرض نوع این فیلد Text در نظر گرفته می شود .
  3. فیلد سوم را Family نامگذاری کنید . با این کار به صورت پیش فرض نوع این فیلد Text در نظر گرفته می شود .
  4. فیلد چهارم را Age نامگذاری کنید . با این کار به صورت پیش فرض نوع این فیلد Text در نظر گرفته می شود .

crud-in-access-with-c#-01
حالا کلیدهای Control+S را بزنید یا دکمه ذخیره در بالا سمت جپ را کلیک کنید تا کادر ذخیره جدول باز شود و از شما نام جدول را درخواست کند . نام جدول را Person بگذارید و روی OK کلیک کنید .

crud-in-access-with-c#-02

فاز اول یعنی ایجاد بانک تمام شد . حالا نوبت یه فاز دوم کار یعنی محیط ویژوال استودیو می باشد . برنامه ویژوال استودیو را باز کنید و سپس از منوی File گزینه New و سپس Project را انتخاب کنید .
crud-in-access-with-c#-03

در پنجره باز شده کارهای زیر را انجام دهید :

  1. Windows Form Application را در قسمت نوع پروژه انتخاب کنید
  2. یک نام دلخواه برای پروژه انتخاب کنید (در اینجا CRUDAccess استفاده شده است)
  3. در قسمت location مسیر ذخیره فایل های پروژه را مشخص کنید
  4. در صورتی که می خواهید فایل های پروژه در پوشه ای همنام با اسم پروژه ذخیره شوند ، تیک گزینه Create directory for solution را بزنید
  5. در پایان روی OK کلیک کنید .

crud-in-access-with-c#-04

یک فرم با اجزای مشخص شده در شکل زیر را طراحی کنید .

crud-in-access-with-c#-05

نام گذاری کنترل های روی فرم را به صورت زیر انجام دهید :

کنترل خاصیت Name
دکمه ثبت Insert
دکمه حذف Delete
دکمه ویرایش Update
جعبه متن نام txtName
جعبه متن فامیلی txtFamily
جعبه متن سن txtAge

با اسم بقیه کنترل ها کار نداشته باشید. تمام عملیات های روی بانک نیازمند برقراری ارتباط با بانک هستند ، که در سی شارپ این کار توسط رشته اتصال یا Connection String صورت می گیرد . پس در ابتدا رشته اتصال را به صورت عمومی یا Public در خارج از همه متدها (بهتر است در بالاترین قیمت امکانپذیر نوشته شود) به صورت زیر تعریف می کنیم :

private string ConnectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}\sampleDB.accdb", Application.StartupPath.ToString());

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

private void Insert_Click(object sender, EventArgs e)
{
    OleDbConnection OleDbConnection1 = new OleDbConnection(this.ConnectionString);
    OleDbCommand OleDbCommand1 = new OleDbCommand();
    OleDbCommand1.Connection = OleDbConnection1;
    OleDbCommand1.CommandType = CommandType.Text;
    OleDbCommand1.CommandText = "INSERT INTO Person(Name, Family, Age) VALUES (@Name,@Famlily,@Age)";
    OleDbCommand1.Parameters.AddWithValue("@Name", this.txtName.Text);
    OleDbCommand1.Parameters.AddWithValue("@Family", this.txtFamily.Text);
    OleDbCommand1.Parameters.AddWithValue("@Age", this.txtAge.Text);
    OleDbConnection1.Open();
    int result = OleDbCommand1.ExecuteNonQuery();
    OleDbConnection1.Close();
    if (result > 0)
    {
        MessageBox.Show("Insert OK");
        this.SelectAllRecords();
    }
    else
    {
        MessageBox.Show("Error In Insert");
    }
}

در کدهای بالا ابتدا یک نمونه از کلاس OleDbConnection به نام OleDbConnection1 ایجاد شده و با استفاده از سازنده کلاس رشته ی اتصال آن تنظیم شده است . سپس یک نمونه از کلاس OleDbCommand به نام OleDbCommand1 ایجاد شده است . مقدار خاصیت connection از کلاس OleDbCommand1 را برای با نمونه کلاس OleDbConnection1 قرار داده ایم . نوع دستور کلاس OleDbCommand1 توسط commandtype از نوع متنی یا text انتخاب شده است . سپس محتوای دستور OleDbCommand1 با دستور insert مقداردهی شده است. سپس اتصال به بانک اطلاعاتی باز می شود .

دستور insert مرتبط با com توسط متد ExecuteNonQuery  اجرا می شود و نتیجه برگشت داده می شود . (متد ExecuteNonQuery یک عدد به عنوان خروجی بر می گرداند . این عدد تعداد سطرهای تحت تاثیر قرار گرفته جدول در اثر اجرای دستور com می باشد . اگر عددی بزرگتر از صفر برگشت داده شود نتیجه می گیریم عملیات ذخیره سازی با موفقیت انجام شده است و در غیر اینصورت می فهمیم که خطایی رخ داده و عمل ذخیره سازی اطلاعات رخ نداده است .) در آخر با دستورات شرطی و بر اساس مقدار متغیر result پیغام مناسب به کاربر نمایش داده می شود . اکنون می خواهیم کدی بنویسیم که اطلاعات جدول Person در datagridview نمایش داده شود . برای اینکار یک متد عمومی می نویسیم که هرگاه نیاز داشتیم که اطلاعات جدول را در دیتاگریدویو نمایش دهیم آن را فراخوانی کنیم . (در زمان بارگذاری یا load فرم و همچنین بعد از عملیات های اصلی برای رفرش کردن دیتاگرید)

public void SelectAllRecords()
{

    OleDbConnection OleDbConnection1 = new OleDbConnection(ConnectionString);
    OleDbCommand OleDbCommand1 = new OleDbCommand();
    OleDbCommand1.CommandType = CommandType.Text;
    OleDbCommand1.CommandText = "SELECT * FROM Person";
    OleDbCommand1.Connection = OleDbConnection1;
    OleDbDataAdapter adapter = new OleDbDataAdapter(OleDbCommand1);
    DataSet DataSet1 = new DataSet();
    adapter.Fill(DataSet1, "Person");
    dataGridView1.DataSource = DataSet1.Tables["Person"];
    dataGridView1.Columns[0].HeaderText = "شناسه";
    dataGridView1.Columns[1].HeaderText = "نام";
    dataGridView1.Columns[2].HeaderText = "نام خانوادگی";
    dataGridView1.Columns[3].HeaderText = "سن";
}

پنج خط اول از کد بالا مشابه دستورات دکمه ذخیره هستند که قبلاً توضیح داده شدند . در خط ششم یک نمونه از کلاس OleDbDataAdapter به نام adapter ایجاد شده است و شی OleDbCommand1 نیز به آن تخصیص داده شده است . سپس یک شی از کلاس Dataset به نام DataSet1 ایجاد شده است .

نکته اینکه کلاس Dataset مجموعه ای از یک یا چند جدول مجازی است و کلاس OleDbDataAdapter  مانند یک منبع تغذیه عمل می کند ، که به کمک نمونه کلاس com یک جدول از کلاس Dataset را پر می کند .

سپس توسط متد Fill از کلاس adapter جدولی به نام person از نمونه کلاس DataSet1 را پر می کنیم (نتایج دستور select در یک جدول مجازی به نام person در DataSet1 قرار می گیرند ). در خط بعدی محتوای جدول مجازی person که در خط قبل پر شده بود  را به datasource یا منبع داده ای کنترل دیتاگرید اختصاص می دهیم . و در آخر عنوان ستون های دیتاگرید را به رشته های دلخواه تغییر می دهیم . اکنون در متد form_load کد زیر که فراخوانی متد نمایش همه اطلاعات جدول person می باشد را می نویسیم

private void Form1_Load(object sender, EventArgs e)
{
   SelectAllRecords();
}

با اینکار هنگام بالا آمدن برنامه اشخاص ثبت شده در جدول person در دیتاگریدویو نمایش داده می شوند . همچنین دستور SellectAllRecord() را بعد از نمایش پیغام موفقیت آمیز بودن ذخیره اطلاعات قرار دهید ، تا بعد از عمل ذخیره سازی رکورد ثبت شده ی جدبد نیز در دیتا گرید ویو نمایش دهده شود(دیتاگرید رفرش شود) . اکنون می خواهیم کدی را بنویسیم که با زدن روی سطر و ستون های دیتاگرید ، اطلاعات مرتبط با آن سطر در فیلدهی متنی نام و نام خانوادگی نمایش داده شوند . برای این کار از رویدادی به نام CellEnter متعلق به کنترل datagridview استفاده می کنیم و کدهای خود را به صورت زیر در آن می نویسیم :

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.Rows.Count > 0)
    {
        this.txtName.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
        this.txtFamily.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
        this.txtAge.Text = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
    }
}

در کدهای بالا دستور if چک می کند که دیتاگرید خالی نباشد . حالا نوبت به کد دکمه حذف اطلاعات می باشد . اگر برای حذف یک شخص از جدول person  شرط قرار ندهیم همه اطلاعات اشخاص در جدول پاک می شوند ، بنابراین نیاز داریم که بر اساس یک فیلد یکتا شرط حذف اطلاعات را مشخص کنیم . اگر بخاطر داشته باشید در ابتدای آموزش در زمان تعریف فیلدهای جدول یک فیلد ID وجود داشت که بدون دستکاری آن را رها کردیم . اکنون با استفاده از همان ID می توانیم اشخاص دلخواه خود در دیتاگرید را حذف کنیم . برای اینکار از کد زیر در رویداد کلیک دکمه حذف استفاده می کنیم :

private void Delete_Click(object sender, EventArgs e)
{
    if (this.dataGridView1.Rows.Count > 0)
    {
       string currentPersonId = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();        
       OleDbConnection OleDbConnection1 = new OleDbConnection(this.ConnectionString);
        OleDbCommand OleDbCommand1 = new OleDbCommand();
        OleDbCommand1.Connection = OleDbConnection1;
        OleDbCommand1.CommandType = CommandType.Text;
        OleDbCommand1.CommandText = "DELETE FROM Person WHERE ID=" + currentPersonId;
        OleDbConnection1.Open();
        int result = OleDbCommand1.ExecuteNonQuery();
        OleDbConnection1.Close();
        if (result > 0)
        {
            MessageBox.Show("Delete OK");
            SelectAllRecords();
        }
        else
        {
            MessageBox.Show("Delete Error");
        }
    }
}

در بالای کدها یک متغیر از نوع رشته ای به نام currentPersonId تعریف می کنیم تا مقدار شناسه شخص را در خود نگهداری کند . ممکن است این سوال به ذهنتان خطور کند که چرا نوع متغیر رشته ای است در حالی که در جدول نوع آن عددی است . نکته اینجاست که چون می خواهیم شناسه را از ستون شناسه در دیتاگریدویو در خاصیت قرار دهیم و مقادیر موجود در دیتاگرید همه از نوع object هستند ، راحتترین راه برای تبدیل ، نوع رشته است . از طرف دیگر چون دستور حذف اطلاعات در کلاس نمونه OleDbCommand1 در نهایت به رشته تبدیل می شود ، بهتر است متغیر را از نوع رشته ای تعریف کنیم .و برای دکمه ویرایش هم از کدهای زیر استفاده می کنیم :

private void Update_Click(object sender, EventArgs e)
{
    if (this.dataGridView1.Rows.Count > 0)
    {
        string currentPersonId = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
        OleDbConnection OleDbConnection1 = new OleDbConnection(this.ConnectionString);
        OleDbCommand OleDbCommand1 = new OleDbCommand();
        OleDbCommand1.Connection = OleDbConnection1;
        OleDbCommand1.Connection = OleDbConnection1;
        OleDbCommand1.CommandType = CommandType.Text;
        OleDbCommand1.CommandText = "UPDATE Person SET Name=@Name,Family=@Family,Age=@Age WHERE Id = @Id";
        OleDbCommand1.Parameters.AddWithValue("@Name",this.txtName.Text);
        OleDbCommand1.Parameters.AddWithValue("@Family",this.txtFamily.Text);
        OleDbCommand1.Parameters.AddWithValue("@Age",this.txtAge.Text);
        OleDbCommand1.Parameters.AddWithValue("@Id",currentPersonId);
        OleDbConnection1.Open();
        int result = OleDbCommand1.ExecuteNonQuery();
        OleDbConnection1.Close();

        if (result > 0)
        {
            MessageBox.Show("Update OK");
            SelectAllRecords();
        }
        else
        {
            MessageBox.Show("Update Error");
        }
    }
}

و درنهایت در رویداد TextChange جعبه متن جستجو کد زیر را می نویسیم :

private void txtSearch_TextChanged(object sender, EventArgs e)
{
    string query = "SELECT * FROM Person WHERE Name LIKE '%" + 
                    this.txtSearch.Text + "%' OR " +
                    "Family LIKE '%" + this.txtSearch.Text + "%'";

    OleDbConnection OleDbConnection1 = new OleDbConnection(ConnectionString);
    OleDbCommand OleDbCommand1 = new OleDbCommand();
    OleDbCommand1.CommandText = query;
    OleDbCommand1.Connection = OleDbConnection1;
    OleDbDataAdapter adapter = new OleDbDataAdapter(OleDbCommand1);
    DataTable result = new DataTable();
    adapter.Fill(result);
    this.dataGridView1.DataSource = result;
    dataGridView1.Columns[0].HeaderText = "شناسه";
    dataGridView1.Columns[1].HeaderText = "نام";
    dataGridView1.Columns[2].HeaderText = "نام خانوادگی";
    dataGridView1.Columns[3].HeaderText = "سن";
}

چند نکته در مورد این آموزش :

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

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. ali43 پاسخ دادن

    با سلام ممنون خدا پدرت را بیامرزد خوب وعالی بود

  2. ali43 پاسخ دادن

    با سلام وقتی تعداد تکس باکس ها رو زیاد می کنم عمل نمی کنه البته یکی از کلون ها کلید ه ( قبلا تو اکسس یه فیلد کلید شده)
    چه کنم که جواب بده

    • اسماعیل ابراهیمی پاسخ دادن

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

  3. sheyda پاسخ دادن

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

    • اسماعیل ابراهیمی پاسخ دادن

      ۱- اگر امکان داره مشکل رو دقیق تر بیان کنید
      ۲- مطمئن هستید که کدهای جستجو رو درست نوشتید ؟
      ۳- فکر می کنم چون بانکتون حجمش زیاده ، قرار دادن کد جستجو در رویداد Text_Change از کنترل textbox جستجو صحیح نباشه ، چون ممکنه در هنگام محاسبات یک جستجو ، جستجوی بعدی هم فراخوانی بشه و باعث رخ دادن خطا بشه
      ۴- بهتره کدهای جستجو رو در یک دکمه بنویسید و تا اتمام پروسه جستجو سایر امکانات رو غیرفعال کنید تا خطایی پیش نیاد

      موفق باشید

  4. sheyda پاسخ دادن

    ممنون از پاسختون
    میشه بیشتر توضیح بدین این کدی است که استفاده کرده ام اما جواب نداد

    try
    {
    	int p = 0;
    	Double k;
    	k = System.Convert.ToDouble(textBox1.Text);
    	string strsql;
    	OleDbConnection con = new OleDbConnection(oleDbConnection1.ConnectionString);
    	con.Open();
    	strsql = "select * from sabtnam";
    	OleDbDataAdapter da = new OleDbDataAdapter(strsql, con);
    	DataSet ds = new DataSet();
    	da.Fill(ds, "sabtnam");
    	OleDbDataReader dr;
    	OleDbCommand cs = new OleDbCommand(strsql, con);
    	dr = cs.ExecuteReader();
    	int i;
    	i = this.BindingContext[ds, "sabtnam"].Count;
    	dr.Read();
    	for (int j = 0; j < i; j++)
    	{
    		if (dr.GetString(2) == textBox1.Text)
    		{
    			p++;
    			textBox2.Text = dr.GetString(0);
    			textBox3.Text = dr.GetString(1);
    			textBox4.Text = dr.GetString(3);
    
    
    		}
    		dr.Read();
    	}
    	con.Close();
    	if (p == 0)
    	{
    		MessageBox.Show("چنین شماره ای موجود نمی باشد");
    		textBox1.Text = "";
    	}
    
    
    }
    catch
    {
    
    	textBox1.Text = "";
    
    }
    
  5. اسماعیل ابراهیمی پاسخ دادن

    دوست عزیز
    لطف کنید یک نمونه از پروژه رو به آدرس ایمیل بنده esmial.abrahimi@gmail.com ارسال کنید تا بهتر راهنمایی کنم
    موفق باشید

  6. سیاوش ابراهیمی پاسخ دادن

    سلام ، در پاسخ دوستمون ” Sheyda ” :
    نمیدونم چرا دارید لقمه رو دور سر می چرخونید ! کاری که شما انجام دادید اینه که ابتدا “تمامی” اطلاعات درون بانک اطلاعاتی رو در حافظه اصلی Load کردین و در در این حافظه دارید عملیات جستجو رو انجام می دین . شاید در تعداد اطلاعات کم این روش پاسخگو باشه ولی در تعداد داده های بزرگ کارایی برنامه رو بشدت پایین میاره .
    به نظر بنده شما باید کوئری که در بالا

    Select * FROM Sabtnam
    

    هست رو به

    SELECT * FROM Sabtnam WHERE columnName = somevalue 
    

    که columnName اسم ستون بانک اطلاعاتی که جستجوی اطلاعات بر اساس اون انجام میشه و somevalue همون مقدار textBox1.text هست ، تغییر بدین.
    با این روش موتور بانک اطلاعاتی تمامی اطلاعات مورد نظرتون رو بهتون میده و نیازی به مقایسه تک تک مقادیر در حافظه نیست .

    موفق و موید باشید : )

  7. سیاوش ابراهیمی پاسخ دادن

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

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

    به عنوان مثالی ساده : اگر تمامی اطلاعات موجود در بانک اطلاعاتیتون ۱۵۰۰۰ باشه و سطر مورد نظرتون شماره ۱۰ باشه تعداد ۱۴۹۹۰ مقایسه دیگه انجام میشه که نیازی به این کار نیست !

    همچنین کاربرد متغیر k در کد بالا رو متوجه نشدم

  8. hasan6 پاسخ دادن

    سلام به مدیران محترم و بروز سایت.
    راستش میخاستم یه خواهش کنم:
    اگر میشه آموزشهای مربوط به entity framwork رو بزارید.
    مخصوصا روش code first
    ممنون.

  9. اسماعیل ابراهیمی پاسخ دادن

    چشم
    در اولین فرصت
    موفق باشید

  10. مجتبی پاسخ دادن

    سلام به همه دوستان
    یه سوال داشتم ممنون میشم اگه کسی جوابشو میدونه راهنمایی کنه
    دو تا فرم دارم میخوام وقتی تو فرم دوم روی یکی از رکوردهای دیتاگرید کلیک کردم تو فرم اول تمام مشخصات رکورد واسه ویرایش نمایش داده بشه
    نمیدونم چطوری میشه اینکارو کرد تو #C
    قبلاً متشکرم

  11. مجتبی پاسخ دادن

    با تشکر از شما یه سوال دیگه داشتم الان شما دو تا تکست باکس دارید که پابلیک معرفی کردید من ۱۵ تا تکست باکس و ۳ تا کومبوباکس دارم همشونو باید پابلیک تعریف کنم و مقداردهی؟
    راه حل ساده تری نداره؟
    میشه وقتی رو یه رکورد کلیک کردیم به طور مثال کدملی تو یه متغیر استرینگ ذخیره شه بعد که فرم اول نمایش داده شد این کدملی که یکی فقط هست اون رکورد رو از بانک بخونه و تو تکست باکسها قرار بده.
    این فقط نظر من بود اگه میشه یه کد واسه خوندن از بانک بهم بگید ممنونتون میشم
    بازم از حوصلتون ممنونم

  12. مجتبی پاسخ دادن

    با سلام به مدیران محترم سایت اگه ممکنه سوال منو جواب بدید
    با تشکر

  13. امیر ع پاسخ دادن

    سلام اقا مجتبی
    ببین اون راهی رو هم که گفتی میشه انجام داد.
    ولی من باید بدونم که شما از چه تکنولوژی ای برای اتصال به پایگاه داده ات، استفاده میکنی؟
    linq , Entity Framework , ADO.NET ؟

  14. مجتبی پاسخ دادن

    سلام آقا امیر ممنونم از حوصله ای که به خرج دادی. راستش از ADO.NET استفاده کردم، یکی از دوستام روش LINQ رو واسم توضیح داده ولی من میخوام از ADO استفاده کنم. ممنون میشم راهنماییم کنی

  15. امیر ع پاسخ دادن

    میترسم راهنماییت کنم اشتباه بشه.آخه ado زیاد کار نکردم. کاشکی با Linq کار کرده بودی.

  16. mohammad پاسخ دادن

    سلام خسته نباشید
    ممنون از آموزشتون

  17. یونس ابراهیمی پاسخ دادن

    سلام آقا مجتبی ، امیدوارم که حالتون خوب باشه ،

    منظورتون از تکست باکس Public همون خاصیت های Public هست که من تعریف کردم ؟

    ببینید لزومی نداره که شما حتما مثلا ۱۵ تا خاصیت از جنس Pubic تعریف کنید و بعد اونا رو مقدار دهی کنید . می تونید از لیست های Generic هم استفاده کنید یا Dictionary ها .

    مثلا مقداری که می خواین در بین فرم ها به اشتراک بزارید رو به یک ترتیب خاص در لیست Generic ذخیره کنید و بعد Reference اون لیست رو به فرم دوم پاس بدین و در فرم دوم مقادیر رو استخراج کنید و در TextBox ها یا کنترل های دیگه نمایش بدین .

    راه های زیادی هست واسه پاس دادن اطلاعات بین فرم ها ، شما باید بر اساس نیاز پروژه تصمیم گیری کنید . مثلا در همون مشکلتون می تونید راحت از Generic List یا Dictionary ها استفاده کنید .

  18. امیر ع پاسخ دادن

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

    • Developer0400 پاسخ دادن

      سلام ، بله میشه اطلاعات رو با استفاده از لیست ها راحت در بین فرم ها انتقال داد .

      در اسرع وقت یک مقاله در این مورد می نویسم.

  19. مجتبی پاسخ دادن

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

  20. mitra پاسخ دادن

    سلام وقتتون بخیر
    چطور میشه روی خانه های جدول تغییرات (عملیات ریاضی) انجام بدیم و اونو در جدول دیگه جا بدیم؟

    • یونس ابراهیمی پاسخ دادن

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

  21. mitra پاسخ دادن

    فرض کنید که جدولی داریم و میخواهیم روی داده های این جدول عملیاتب انجام بدیم و اونارو داخل یه جدول دیگه نمایش بدیم

    • یونس ابراهیمی پاسخ دادن

      آدرس انجمن forum.w3-farsi.com
      شرمنده توی آدرس بالا مطرح بفرمایید.

  22. ابوالفضل پاسخ دادن

    با عرض ادب و احترام خدمت همه دست اندرکاران این سایت
    خواستم بگم من میخوام یک صفحهlogin بسازم ولی هر چی میگردم نیست.
    ویژوال من ۲۰۱۲ هستش.

  23. یونس ابراهیمی پاسخ دادن

    سلام دوست عزیز…اینم لینک
    http://www.w3-farsi.com/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%81%D8%B1%D9%85-%D9%88%D8%B1%D9%88%D8%AF-login/

  24. نگین دانایی پاسخ دادن

    سلام ممنون از سایت خوبتون.
    من می خوام اسامی فیلدها که در اینجا شما نام و نام خانوادگی و… تعریف کردیدو از خود کاربر بگیره ، آیا این امکان وجود داره ؟

    • Developer0400 پاسخ دادن

      سلام ، منظورتون نام فیلد ها در Datagridview هست ؟ یا اینکه اسم فیلد ها در بانک اطلاعاتی منظورتون هست ؟

      در هر دو حالت میشه .

      در حالت اول : می تونید به هر طریقی نام فیلد رو از کاربر بگیرید و اونو در خاصیت HeaderText ستون مورد نظر قرار بدین .
      در حالت دوم : بعد از اینکه مقدار رو از کاربر گرفتید باید با استفاده از دستورات SQL اونو به نام ستون مورد نظر نسبت بدین.

  25. نگین دانایی پاسخ دادن

    میشه شما لطف کنید همین قسمتو واسه ما انجام بدید یا ایمیلتونو بدید تا من پروژمو واستون میل کنم

    • Developer0400 پاسخ دادن

      ایمیل بنده : vbnetgenius@gmail.com
      می تونید در فروم هم بپرسید شاید دوستان دیگه راه حل بهتری داشتند.

  26. mitra پاسخ دادن

    عالی بود.مرسی از سایت خوبتون

  27. علی حاجی ملا حسین پاسخ دادن

    واقعا به خاطر زحماتتون تشکر می کنم

  28. محمد انصاری پاسخ دادن

    سلام در صورتی در یک بانک دو جدول باشد و بعضی فیلدها در هز دو جدول نیاز باشد که فیلد تکراری ثبت نکند درمثلا کد دانش اموز و نام در دو جدول باشد…..در sqlچه کاری باید انجام شود…کد در ویژوال چگونه است؟…با تشکر

  29. Developer0400 پاسخ دادن

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

  30. amir پاسخ دادن

    باعرض سلام،ادب و احترام
    آقای ابراهیمی عزیز بابت سایت خوبتون بی نهایت سپاسگزارم.فقط در کد بالا برای دستور حذف،خط چهارم به جای OleDbConnection1.Open(); عبازت OleDbCommand1.Open(); را نوشته اید که باعث خطا دادن برنامه می شود.لطفا آن را اصلاح نمایید تا دوستان با مشکل مواجه نشوند. باتشکر

    • Developer0400 پاسخ دادن

      بسیار سپاسگزارم از لطفتون
      اصلاح شد

  31. یاسر پاسخ دادن

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

    • Developer0400 پاسخ دادن

      سلام ؛ لطفا سوالاتتون رو در بخش فروم سایت بپرسید . ضمنا دستور Update رو هم بنویسید . احتمال می دم منظورتون اینه که تمامی رکورد ها ویرایش می شن . باید قسمت Where دستور رو بنویسید

  32. کازیوه پاسخ دادن

    سلام خسته نباشیدمن یه برنامه نوشتم بدون استفاده از database میشه کمکم کنیدکه نمایش اطلاعاتم در datagridview وجستجووویرایش در labelباشه بعدش تو datagridمتن ویرایش شدمون رونشون بده
    ممنون اگه کمکم کنید

    • یونس ابراهیمی پاسخ دادن

      سلام دوست عزیز… سوالتونو توی بخش (( پرسش و پاسخ ))مطرح بفرمایید، تا دوستان راهنمایی کنن

  33. حميد صلحي پاسخ دادن

    سلام من یه راهنمایی میخواستم تازه کارم
    میخوام تو دیتاگرید فقط ۱۰ تارکورد آخر جدولم نمایش داده بشه

  34. sara پاسخ دادن

    سلام ، خسته نباشید
    آموزشاتون عالیییییییی
    همیشه موفق باشید
    ممنون

  35. احسان پاسخ دادن

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

    می خواستم توی همین برنامه ای که توی این پست برای دانلود گداشتید؛ سرچ بر اساس یکی از فیلدها رو هم بزارید. البته تمام بخشای دیگه هم خوندم ولی
    قسمت سرچشون رو بر اساس SQL توضیح داده بودید، می خواستم دقیقآ به همین برنامه که در همین صفحه برای دانلود گذاشتید، یک دکمه سرچ براساس یکی
    از فیلدها هم بزارید؛ البته با همین بانک اطلاعاتی اکسس؛ به نحوی که وقتی یکی از text ها رو (مثلآ نام) برای سرچ پر می کنیم و دکمه سرچ زده میشه
    اطلاعات اون رکورد فیلد به فیلد از بانک واکشی بشه و توی text مربوط به خودش نمایش داده بشه…

    ممنون میشم…

    • یونس ابراهیمی پاسخ دادن

      به ایملیتون ارسال شد.

      موفق باشید./

      • یسنا پاسخ دادن

        لطفا کد جستجو رو هم بذارید… که وقتی چیزی سرچ میشه مقادیر ثبت شده رو توی تکست نشون بده… قبلا هم گذاشتید .
        لطفا بذارید :(

  36. reza پاسخ دادن

    سلام
    من می خوام توسط دستور زیر برای اضافه کردن مورد از تکس باکس به دیتا گرید ویو استفاده کنم اما جواب نمی ده
    میشه راهنمایی بفرمایید
    لطفا جوابشو برام ایمیل کنید:
    ممنون

    //this.table2TableAdapter.Insert(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox4.Text), Convert.ToInt32(textBox5.Text), Convert.ToInt32(textBox6.Text), Convert.ToInt32(textBox9.Text), textBox2.Text, textBox3.Text);
  37. armin157 پاسخ دادن

    سلام خدمت شما ببخشید من با تکنولوژی Linq در حال طراحی یک برنامه هستم ولی حذف کردن اطلاعات با خطا مواجه شده و با بانک اطلاعاتی اس کیو ال سرور ۲۰۰۸ کار میکنه حاالا میشه کدی معرفی کنید که خطا نگیره کد بنده را خطا میگرد با تشکر

  38. کوثر پاسخ دادن

    با سلام
    من توی برنامه ۱۳ تا اطلاعات دارم که باید توی بانک ثبت بشه اما فقط ۹ تا توی بانک ذخیره میشه…
    لطفا راهنمایی کنید. اگه لازم هست برنامه رو براتون بفرستم

    • یونس ابراهیمی پاسخ دادن

      سلام ، ممنون میشم سوالتونو توی انجمن مطرح بفرمایید

  39. یسنا پاسخ دادن

    سلام.. تشکر از سایت بسیار مفیدتون.
    میشه لطفا کد جستجو همین برنامه رو هم بذارید…
    خیییییییییییییییییییییییییییلی ممنون
    منتظرم :)

  40. yasna پاسخ دادن

    سلام :(
    میشه لطفا کد جستجو رو هم بذارید؟؟ برا یکی از کاربرا ایمیل کردین :(
    لطفا کدش رو بذارید یا ایمیل کنید
    مممنوووووون میشم

  41. یسنا پاسخ دادن

    چراااااااااااااااااااااا هیشکی جوابمو نمیده :(

    • یونس ابراهیمی پاسخ دادن

      چشم دوست عزیز…تو امتحاناتم… سعی می کنم تا فردا بذارم براتون

      • یسنا پاسخ دادن

        ممنونم آقای ابراهیمی :)
        ایشالاا همه رو ۲۰ بگیرید :)

  42. مهری پاسخ دادن

    سلام خسته نباشین
    من یه پروژه درسی دارم که ساخت لوگین هست که وارد میشی حذف و درج و آپدیت کردن دیتابیس هست
    من مشکلم اینه که اسکول سرور نصب نمیشه میتونم از اکسل کمک بگیرم؟
    یه سوال دیگر اینو میخوام در صفحه وب انجام بدم نه فرم؟
    رهنمایی لطفا
    ممنونم

    • یونس ابراهیمی پاسخ دادن

      سلام ، لطفا سوالات خودتون رو در بخش پرسش و پاسخ سایت بپرسید .
      می تونید از SQL SERVER EXPRESS استفاده کنید .
      یک تاپیک بزنید در فروم

  43. یسنا پاسخ دادن

    سلام آقای ابراهیمی… امتحاناتون تموم نشد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
    خودم یه کد نوشتم اما اجرا نمیشه :(

    • یونس ابراهیمی پاسخ دادن

      سلام ، براتون ارسال شد.

      • یسنا پاسخ دادن

        سلام آقای ابراهیمی.. خیلی ممنون که جواب دادید.
        اما منظورم این کد نیست.. من میخام اطلاعاتی که توی بانک هست رو توی تکست باکس نشون بده.
        مثلا وقتی کد کسی رو جستجو میکنم بقیه اطلاعاتش روی تکست باکس مربوط به خودش نشون بده.
        مثلا وقتی کد رو جستجو میکنم اسمش رو هم توی تکست باس مربوط به نام که رو ی فرم هست نشون بده نه توی دیتا گرید ویوو..
        این سوال رو قبلا هم یکی ازتون خواسته بود.
        ممنون میشم اگه کمکم کنید.

        • یونس ابراهیمی

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

        • یسنا

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

        • یونس ابراهیمی

          سلام، الان که خسته ام ولی کدتون رو بفرستین به ایمیلم تا فردا براتون درست کنم…
          younes.ebrahimi.1391@gmail.com

        • یسنا

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

        • یونس ابراهیمی

          خواهش می کنم، شما لطف دارین

  44. محمد داوری پاسخ دادن

    سلام خسته نباشین من کد آپدیتو که مینویسم فقط دیتا گرید ویوم آپدیت میشه و دیتابیسم اصلا تغییری نمی کنه .
    کد آپدیتم:

    SqlCommand cmd2 = new SqlCommand("UPDATE driver SET named=@ahmad WHERE codemeli=@num", con);
    cmd2.Parameters.AddWithValue("@ahmad","gholamreza");
    cmd2.Parameters.AddWithValue("@num", "0720291951");
    //connect.Open();
    cmd2.ExecuteNonQuery();
    • یونس ابراهیمی پاسخ دادن

      سلام لطفا سوالتون رو در بخش پرسش و پاسخ سایت بپرسید .

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

  45. mahditaherian پاسخ دادن

    منم از acceess 2013 استفاده می کنم تو con.open();error
    داد کلافم لطفا بگید چطور حل کنم

    • یونس ابراهیمی پاسخ دادن

      پیغام خطاش چیه؟

  46. mahditaherian پاسخ دادن

    با سلام و تشکر

    The ‘Microsoft.ACE.OLEDB.12.0′ provider is not registered on the local machine.

    • یونس ابراهیمی پاسخ دادن

      توی solution explorer یه پوشه به نام properties هست روش دوبار کلیک کنید و یه صفحه باز میشه ، یه سربرگ به نام Build داره اونو بزنید و گزینه Platform target رو بذارین روی مثلا x86

  47. mahditaherian پاسخ دادن

    با سلام , متشکرم مشکلم حل شد

  48. سعید عزیزی پاسخ دادن

    با سلام
    من یک datagridview دارم که دادهاشو از چنتا table میگیره حالا برا حذف دادها مشکل دارم ،لطفن راهنمایی کنید

    • یونس ابراهیمی پاسخ دادن

      سلام، ممنون میشم سوالتونو توی انجمن مطرح بفرمایید

  49. kuuzzmm پاسخ دادن

    سلام من یه بانک دارم تو اکسس که شمار پرسنلی و اطلاعات همکاران رو داره به عنوان اطلاعات ثابت و بعدش میخوام یه سری اطلاعات رو کاربر وارد کنه
    برا ثبت تشویقی همکاران
    اطلاعات رو میاره تو دیتا گرید
    ولی نمی دونم چطور اطلاعات جدید رو وارد کنم / مخصوصا اطلاعات تاریخش رو
    تقریبا الان وسط برنامه گیج موندم

    • یونس ابراهیمی پاسخ دادن

      سلام دوست خوبم ، اگر امکان داره سوالاتتون رو در بخش پرسش و پاسخ سایت بپرسید .
      با تشکر

  50. sina777 پاسخ دادن

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

  51. sina777 پاسخ دادن

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

  52. ehsan پاسخ دادن

    سلام میشه لطف کنید برنامه ای که ساختید رو لینکشو برام ایمیل کنید

  53. azita.rahmani پاسخ دادن

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

    • یونس ابراهیمی پاسخ دادن

      سلام، سعی میکنم تا شب براتون ارسال کنم یا توی سایت قرار بدم

  54. محمد پاسخ دادن

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

  55. mahshad پاسخ دادن

    سلام
    چطور میتونم اطلاعات ورودی فرم رو در اکسل به صورت مرتب ذخیره کنم؟!! :(

  56. وحید پاسخ دادن

    سلام دوستان من یه دیتا گرید دارم میخوام وقتی روی یه سطر کلیک کردم و تمام اون سطر انتخاب شد اطلاعات سطر انتخاب شده به تکست باکس های فرم دیگه منتقل بشه ممنون میشم کد کامل شو بهم بگید

  57. بهروز پاسخ دادن

    با سلام
    میخواستم ببینم آیا امکانش هست که مقدار ID جداول رو خودمون بدیم نه اینکه خود دیتا بیس اضافه کنه؟
    مثلا مشخصات یک فرد کلید اصلیش شماره ملی اون شخص باشه که خودمون ب دیتا بیس بدیم و دیگه نیازی به وجود ستون ID در جدولمون نباشه
    ممنون میشم راهنمایی کنید

  58. محمدابراهیم فلاح پاسخ دادن

    سلام . یه سوال موقع اتصال به دیتابیس با این ارور مواجه میشم :(
    The ‘Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine

  59. محمد جهانی پاسخ دادن

    با سلام شما نوشتید که فایل دیتا بیس ساخته شده رو در مسیر برنامه در پوشه debug قرار بدیم ولی من در ویژوال استودیو همچین پو.شه ای ندارم. ویژوال استودیو من ۲۰۱۵ هستش با تشکر لطفا راهنمائی کنید

    • یونس ابراهیمی پاسخ دادن

      سلام دوست عزیز
      بنده هم از VS2015 استفاده می کنم. هست …داخل پوشه bin ه… مسیری به صورت زیر :

      C:\Users\youpc\Documents\Visual Studio 2015\Projects\WindowsFormsApplication5\WindowsFormsApplication5\bin\Debug