PDA

View Full Version : update کردن یک جدول با رکوردهای زیاد



kahkeshan_25
یک شنبه 15 اردیبهشت 1387, 08:44 صبح
با سلام من یه جدول دارم با 17000 رکورد .حال می خوام یه سری تغییرات توشون بدم(اپدیت) بدون اینکه رکورد جدیدی اضافه کنم.به اینصورت عمل می کنم که کل رکوردهای جدول رو با یک دیتا اداپتور توی دیتا ست میریزم و همچنین دیتا اداپتور رو به کامند بیلدر اتصال می دم و رکورد ها رو توی دیتا گرید ویو میریزم .وقتی تغییرات رو انجام میدم و می خوام توی دیتا بیس اعمال کنم خطا می گیره......
OleDbConnection my_cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Documents and Settings\\f_taran\\My Documents\\zanjan.mdb");
OleDbDataAdapter da;
OleDbCommandBuilder cb;
DataSet ds = new DataSet();
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
da = new OleDbDataAdapter(" select * from tohi", my_cn);

da.Fill(ds);
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Table";
cb = new OleDbCommandBuilder(da);

}

private void button1_Click(object sender, EventArgs e)
{
da.UpdateCommand = cb.GetUpdateCommand();
da.Update(ds, "Table");
}
اگه ممکنه راهنماییم کنید. با تشکر

hdv212
یک شنبه 15 اردیبهشت 1387, 12:28 عصر
خطا از چی میگیره ؟ میگه نیاز به Update Command معتبر داره ؟

kahkeshan_25
یک شنبه 15 اردیبهشت 1387, 12:49 عصر
اره خطای زیر رو میده
Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

hdv212
یک شنبه 15 اردیبهشت 1387, 13:48 عصر
ظاهرا در دستور Select ای که به CommandBuilder پاس کردی، فیلد Primary رو Select نکردی یا مشخص نکردی.
سعی کن همه ی فیلدهارو در دستور Select انتخاب کنی، و یا اگه کردی، فکر کنم یکی از propertyهای آبجکت CommandBuilderات رو ب ناما فیلد Primary Key از جدولت مقدار دهی کنی.

kahkeshan_25
یک شنبه 15 اردیبهشت 1387, 14:10 عصر
اگه ممکنه کدشو بذارید.......

hdv212
یک شنبه 15 اردیبهشت 1387, 16:25 عصر
این نمونه کد رو ببین :

// define this objects globally
string strCon;
SqlConnection con;
SqlCommand cmdSelect;
SqlDataAdapter adapter;
SqlCommandBuilder builder;
SqlCommand cmdUpdate;
DataTable dt = new DataTable();

// load data into dataGridView and create new object
// from some objects that define in above code
private void button11_Click(object sender, EventArgs e)
{
strCon = "Server=.;Database=testdb;Trusted_Connection=True;";
con = new SqlConnection(strCon);
cmdSelect = new SqlCommand("select id,fname,lname from Student", con); // in the commandText, id is Primary key field that we should select it
SqlDataReader dr;
dt = new DataTable();
con.Open();
dr = cmdSelect.ExecuteReader();
dt.Load(dr);
con.Close();

this.dataGridView2.DataSource = dt;
}

// update data by create new object from adapter,builder
// and pass appropriate parameters to it and then call Update() method
private void button12_Click(object sender, EventArgs e)
{
adapter = new SqlDataAdapter(cmdSelect);
builder = new SqlCommandBuilder(adapter);
adapter.Update(dt);
}
همانطور که در توضیحات نوشتم، زمانی که میخوای از جدولت Select بگیری، بایستی فیلد کلیدی یا Primary Key رو هم انتخاب کنی تا CommandBuilder بتونه دستور Update رو براساس اون فیلد برات بسازه، در اینجا، فیلد id فیلد Primary Key ما هست.

kahkeshan_25
دوشنبه 16 اردیبهشت 1387, 07:30 صبح
با تشکر از کدتون.
من خودم کد شبیه اینو داشتم ولی باز خطا میداد کد شما رو هم امتحان کردم دوباره همون خطا رو میداد.
روی یه جدول دیگه با فیلد اصلی امتحان کردم که هر دو کدم جواب داد مشکل از جدول بود(اونو از فاکس پرو import کرده بودم)به هر حال مشکلم حل شد.
ممنون از وقتی که بهم دادید.

hdv212
دوشنبه 16 اردیبهشت 1387, 12:31 عصر
(اونو از فاکس پرو import کرده بودم)به هر حال مشکلم حل شد
پس احتمالا چون Import کرده بودی، فیلد PK شاید نداشته.

sarkhosh
شنبه 22 تیر 1387, 09:05 صبح
اگر دو جدول باشه کدی که نوشتید جواب میده؟؟