PDA

View Full Version : سوال: batch saving روشی برای آپدیت گروهی اطلاعات



hmahdavi921
پنج شنبه 02 بهمن 1393, 16:49 عصر
سلام
با این روش میشه وقتی که اطلاعات رو از دیتابیس میخونین به صورت گروهی مثلا100تا 100 یک یا چند فیلد رو تغییر بدین ، حذف کنین و ...
روش کار اینکه اول اطلاعات رودر دیتاست پر میکنین بعد مشخص میکنین که چند تا چند تا این آپدیت رو انجام به .هر وقت دیتا ست پر شد(100 تا) اونوقت همه 100 رکورد رو یکجا آپدیت میکنه .خوبیش تو اتصال کم به دیتا بیس هستش.کد اصلی که دارم و کار میکنه به این صورته:

using System;using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Configuration;


public partial class pSavingBatches : System.Web.UI.Page
{
SqlDataAdapter da = new SqlDataAdapter();
System.Text.StringBuilder sb = new System.Text.StringBuilder();


protected void Page_Load(object sender, EventArgs e)
{


}


private void rowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
sb.Append("Rows: " + e.RecordsAffected.ToString() + "\r\n");
}


protected void btnSavingBatches_Click(object sender, EventArgs e)
{
ConnectionStringSettings pubs =
ConfigurationManager.ConnectionStrings["Pubs_User1"];
DbConnection connection =
new SqlConnection(pubs.ConnectionString);


//event subscription is normally placed in constructor but is here
//to encapsulate the sample
da.RowUpdated += new SqlRowUpdatedEventHandler(rowUpdated);


SqlCommand cmd = (SqlCommand)connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM Publishers";
da.SelectCommand = cmd;
DataSet pubsDataSet = new DataSet("Pubs");
SqlCommandBuilder bldr = new SqlCommandBuilder(da);
da.Fill(pubsDataSet, "publishers");
//Modify data here
foreach (DataRow dr in pubsDataSet.Tables["publishers"].Rows)
{

dr["pub_name"] = "1";
+ DateTime.Now.Minute.ToString()
+ DateTime.Now.Second.ToString();
}
da.UpdateBatchSize = 3;


da.Update(pubsDataSet, "publishers");


//if event subscription is in the contructor, no need to
//remove it here. . ..
da.RowUpdated -= new SqlRowUpdatedEventHandler(rowUpdated);


lbl.Text = sb.ToString();
}
}
وقتی رو دکمه کلیک میشه نام انتشاراتی روکه در شرط select صدق میکنند رو به aaaaدقیقه ثانیه تغییر میده
من کدم یه کم متفاوت هستش و داخل کلاس نوشتم :constr در داخل سازنده کلاس مقداردهی شده. من تو گرفتن اطلاعات مشکلی ندارم فقط به جای اینکه دیتابیس آپدیت بشه موقع نشون دادن اطلاعات count_views رو 1 نشون میده ودیتابیس تغییری نمیکنه






private DataSet FillDataSet(SqlCommand cmd, string Table_lavazem_electronic) {
SqlConnection con = new SqlConnection(constr);



DataAdapter.RowUpdated += new SqlRowUpdatedEventHandler(rowUpdated);
cmd.Connection = con;
DataAdapter.SelectCommand = cmd;
DataSet ds = new DataSet();
SqlCommandBuilder bldr = new SqlCommandBuilder(DataAdapter);
con.Open();
DataAdapter.Fill(ds, Table_lavazem_electronic);
foreach (DataRow dr in ds.Tables[Table_lavazem_electronic].Rows)
{
dr["count_views"] = 1;

}
DataAdapter.UpdateBatchSize =3;
DataAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(rowUpdated);

con.Close();

return ds;


}

روستان لطفا راهنمایی بفرمایین!!!!! ضروریه

hmahdavi921
پنج شنبه 02 بهمن 1393, 21:10 عصر
کد باید به این صورت تغییر کنه:

DataAdapter.RowUpdated += new SqlRowUpdatedEventHandler(rowUpdated);
SqlConnection con = new SqlConnection(constr);
cmd.Connection = con;
DataAdapter.SelectCommand = cmd;
DataSet ds = new DataSet("haftehbazardb");
SqlCommandBuilder bldr = new SqlCommandBuilder(DataAdapter);
con.Open();
DataAdapter.Fill(ds, Table_lavazem_electronic);
foreach (DataRow dr in ds.Tables[Table_lavazem_electronic].Rows)
{
dr["count_views"] = 1;

}
DataAdapter.UpdateBatchSize =3;
DataAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(rowUpdated);
DataAdapter.Update(ds, Table_lavazem_electronic);
con.Close();

return ds;


}


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

hmahdavi921
جمعه 03 بهمن 1393, 08:47 صبح
با این تغییر درست میشه

foreach (DataRow dr in ds.Tables[Table_asbabbazi].Rows) {

string str=dr["count_views"].ToString() ;
int number=Int32.Parse(str);
number += 1;
dr["count_views"] = number;