PDA

View Full Version : مشکل در Updete کردن دیتابیس با DataGridView :(



kkkaka
یک شنبه 05 شهریور 1391, 12:54 عصر
سلام دوستان
من کلی سرچ کردم ولی متاسفانه جوابمو پیدا نکردم.
بنده یک دیتا گرید دارم که توش یه ستون چک باکس هست و میخواهم تغیرات کاربرم رو در دیتابیس ذخیره کنم.
کلآ میخوام بدونم چطور میشه تغییرات دیتا گرید رو ذخیره کنم .
این یه نمونه است که پیدا کردم ولی مشکل داره
این کد رو درباتن Load مینویسم.


string query = "SELECT * FROM mytable";
da = new SqlDataAdapter(query,cn);
SqlCommandBuilder cBuilder = new SqlCommandBuilder(da);
DataTable dt = new DataTable();
da.Fill(dt);
BindingSource bSource = new BindingSource();
bSource.DataSource = dt;
dgv1.DataSource = bSource;

واین رو در باتن Update که متاسفانه نمیتونه da رو بشناسه!!


private void button1_Click(object sender, EventArgs e)
{
da.Update(dt);
}

ehsan7007
یک شنبه 05 شهریور 1391, 13:51 عصر
da رو تو خودش تعریف کن.

Y_Safaiee
یک شنبه 05 شهریور 1391, 13:56 عصر
با سلام خدمت شما دوست عزیز

da یا dt?

اگه da رو نمیشناسه بعد partial (یعنی به صورت سراسری) تعریف کنید و اگه dt رو نمیشناسه مشکل اینه که به صورت سراسری تعریف نشده و متغییر رویدادیه

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

موفق باشی
بایت بایت

kkkaka
یک شنبه 05 شهریور 1391, 14:46 عصر
بفرمائید:


public Form1()
{
InitializeComponent();
}
SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=test;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
SqlDataReader dr;
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();

private void Fill_Click(object sender, EventArgs e)
{
try
{
{
//پر کردن جدول و ایجاد ستون چک باکس
da = new SqlDataAdapter("select * from t2", cn);
ds = new DataSet();
da.Fill(ds, "t2");
dgv1.DataSource = ds;
dgv1.DataMember = "t2";
dgv1.AutoGenerateColumns = true;
DataGridViewCheckBoxColumn myCheck = new DataGridViewCheckBoxColumn();
myCheck.HeaderText = "مجازی";
myCheck.DataPropertyName = "value";
myCheck.FalseValue = "0";
myCheck.TrueValue = "1";
dgv1.AutoGenerateColumns = false;
dgv1.Columns.Insert(0, myCheck);
cn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
cn.Close();
}
}

private void Update_Click(object sender, EventArgs e)
{
da.Update();
}


میخوام وقتی کاربر رکوردمو تیک زد تو بانک درج کنم.
ضمنآ اگر زحمتی نیست یه نگاه به این پستم بندازید ممنون میشم.


http://barnamenevis.org/showthread.php?357897-%D8%AA%DB%8C%DA%A9-%D8%AE%D9%88%D8%B1%D8%AF%D9%86-checkbox-%D8%AF%D8%B1-Datagridview-%D8%9F%D8%9F%D8%9F%D8%9F&p=1578885#post1578885

Y_Safaiee
یک شنبه 05 شهریور 1391, 15:04 عصر
با سلام مجدد

شما در قسمت معرفی سراسری da رو کامل تعریف کردید و باز در قسمت Fill باز دوباره یه da دیگه ساختیت که در کل میشه 2تا dataadapter



در کد سراسری
SqlDataAdapter da = new SqlDataAdapter();

دوباره یک dataadaper در فسمت Fill
da = new SqlDataAdapter("select * from t2", cn);


در قسمت سراسری da رو اینطوری تعریف کنید:


SqlDataAdapter da;


بعد در قسمت Fill بهش مقدار داره میشه و در آپدیت چون فقط 1 datadapter وجود داره بدون ارور بروزرسانی میشه

موفق باشی
بایت بایت

kkkaka
یک شنبه 05 شهریور 1391, 15:38 عصر
SqlDataAdapter را در قسمت سراسری تعریف کردم ولی مشکل حل نشد
من در قسمت Update نباید به da.Update(); هیچ آرگومانی را ارسال کنم؟
از کجا میفهمه چه چیزی در دیتا گریدویوو تغییر کرده؟؟

kkkaka
دوشنبه 06 شهریور 1391, 11:41 صبح
دوستان مشکل بنده همچنان پابرجاست لطفآ راهنمایی کنید.
اگر امکان داره یه نمونه برنامه هم معرفی کنید ممنون میشم...

kkkaka
دوشنبه 06 شهریور 1391, 19:54 عصر
خواهشآ یکی یه برنامه ای راهی برای بنده بذاره ...

felfely
دوشنبه 06 شهریور 1391, 20:29 عصر
سلام

به این آدرس یه سری بزنین
http://forums.devshed.com/net-development-87/update-table-in-database-through-datagridview-in-winform-350445.html

kkkaka
سه شنبه 07 شهریور 1391, 12:06 عصر
دوستان من هرچی با این متد Update ور رفتم نتونستم کاری پیش ببرم !
واسه همین یه متد نوشتم که جدولمو مرور میکنه و مقادیر یک ردیف خاص رو در جدولم به روز میکنه ولی در واقع داره مقدار آخرین ردیف رو در بقیه ردیف ها کپی میکنه!
این کدشه :

public void update_tbl(string tbl_name)
{
try
{
foreach(DataGridViewRow row in dgv1.Rows)
{
if (row.Cells[0].Value.ToString() == "1")
cn.Open();
cmd.CommandText = "update [" + tbl_name + "] set tf='" + row.Cells[1].Value.ToString()+"'";
cmd.ExecuteNonQuery();
cn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.Close();
cn.Close();
}
}

ehsan7007
سه شنبه 07 شهریور 1391, 13:50 عصر
طبق فرمایش جناب Youuness به صورت سراسری تعریفش کن، شما این کار رو اصلا انجام نمی دی!!!

ehsan7007
سه شنبه 07 شهریور 1391, 13:54 عصر
اگه اشتباه نکرده باشم :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

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

}

SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=test;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds ();




private void button1_Click(object sender, EventArgs e)
{
try
{
SqlDataAdapter da = new SqlDataAdapter("select * from t2", cn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void button2_Click(object sender, EventArgs e)
{
da.Update(ds);

}

}
}

kkkaka
سه شنبه 07 شهریور 1391, 14:24 عصر
احسان جان اونجوری هم تعریف کردم ولی متاسفانه جواب نداد .

ehsan7007
سه شنبه 07 شهریور 1391, 14:36 عصر
کانکشن استرینگت همینه؟ :

SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=test;Integrated Security=True");

kkkaka
سه شنبه 07 شهریور 1391, 14:45 عصر
بله.درسته همینه.

ehsan7007
سه شنبه 07 شهریور 1391, 14:54 عصر
با نامه پیش فرض این طوری میشه :
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");


موفق باشی!

kkkaka
سه شنبه 07 شهریور 1391, 15:24 عصر
احسان جان فکر نمیکنم اشتباه باشه من با همین کانکشن به راحتمی DatagridView رو Fill میکنم اگر اشتباه باشه که اصلآ نمیشه.
دوستان کسی یه برنامه کوچیک نداره که همین کار رو انجام بده؟

kkkaka
سه شنبه 07 شهریور 1391, 15:48 عصر
دوستان مشکل بنده با این تابع حل شد!!!

public void update_tbl(string tbl_name)
{
try
{
foreach(DataGridViewRow row in dgv1.Rows)
{
cn.Open();
cmd.CommandText = "update [" + tbl_name + "] set tf='" + row.Cells[0].Value.ToString()+"' where docid='"+row.Cells[1].Value.ToString()+"'";
cmd.ExecuteNonQuery();
cn.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.Close();
cn.Close();
}
}

tf = رکورد نگه دارنده مقادیر value که برابر 0 یا 1 است.
doc id = که یک رکود از نوع identity است.
Tbl_name = این هم که نام جدولمه.
موفق باشید.