PDA

View Full Version : ثبت نهایی اطلاعات گریدویو در دیتابیس با sqldataadapter



aliyeh
دوشنبه 16 بهمن 1391, 09:26 صبح
سلام به همه دوستان
من برای ثبت موقت اطلاعات در گریدویو و بعد نهایی کردن تغییرات از sqldataadapter استفاده می کردم.
الان دارم برنامه رو با روش معماری سه لایه انجام می دم. بنا بر این در تعریف sqlcommand و مقداردهی dataadapter موندم. چطور می تونم این کار رو انجام بدم؟
این هم نمونه کدی هست که در گذشته ازش استفاده می کردم:
//----------select command setting for data adapter---------
SqlCommand cmd = new SqlCommand("select * from Exams", cnn);
da.SelectCommand = cmd;

//-----------insert command setting for data adapter-------
cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "insert into Exams(name) values(@name)";
//------------declare parameter----------------
SqlParameter pm = new SqlParameter();
pm.DbType = DbType.String;
pm.Direction = ParameterDirection.Input;
pm.ParameterName = "@name";
pm.SourceColumn = "name";
cmd.Parameters.Add(pm);

da.InsertCommand = cmd;

//--------update command setting for data adapter--------------
cmd=new SqlCommand();
cmd.Connection=cnn;
cmd.CommandText="update Exams set name=@name where id=@oldid";

//-------declare parameter---------
pm = new SqlParameter();
pm.ParameterName = "@name";
pm.SourceColumn = "name";
pm.DbType = DbType.String;
cmd.Parameters.Add(pm);

pm = new SqlParameter();
pm.ParameterName = "@oldid";
pm.SourceColumn = "id";
pm.DbType = DbType.Int32;
pm.SourceVersion = DataRowVersion.Original;
cmd.Parameters.Add(pm);
da.UpdateCommand = cmd;

//----------delete command setting for data adapter------------
cmd=new SqlCommand();
cmd.Connection=cnn;
cmd.CommandText="delete Exams where id=@id";
//---------declare parameter------------
pm=new SqlParameter();
pm.ParameterName="@id";
pm.DbType=DbType.Int32;
pm.SourceColumn="id";
pm.SourceVersion=DataRowVersion.Original;
cmd.Parameters.Add(pm);
da.DeleteCommand = cmd;

if (IsPostBack)
ds = (DataSet1)Session["ds"];
else
{
ds = new DataSet1();
da.Fill(ds.Exams);
Session.Add("ds", ds);
da.Update(ds.Exams);
}

GridView1.DataSource = ds;
GridView1.DataMember = "Exams";
GridView1.DataBind();
cnn.Close();

alihassanabadi
دوشنبه 16 بهمن 1391, 10:31 صبح
سلام
میتونید تو لایه ui با یک for همه رکوردها رو بفرستی به لایه تجاری بعد به لایه داده و اونجا ثبتش کنی
مثال:
لایه ui برای ثبت کل رکوردهای

for (int c = 0; c <= GridView1.Rows.Count - 1; c++)

{
Label lblID = (Label)GridView1.Rows[c].FindControl("lblEmpID");
Label lblFName = (Label)GridView1.Rows[c].FindControl("lblFName");
Label lblLName = (Label)GridView1.Rows[c].FindControl("lblLName");
Label lblCity = (Label)GridView1.Rows[c].FindControl("lblboxCity");
Label lblState = (TextBox)GridView1.Rows[c].FindControl("lblboxState");
int id = Convert.ToInt32(lblID.Text);
bll.YourClass.InsertRecord(id, lblFName.Text, lblLName.Text, lblCity.Text, lblState.Text);

}

فرض تو لایه دیتا این این متد تو یکی از کلاس هاته

private void InsertRecord(int id, string fname, string lname, string city, string state)
{
string connString = ConfigurationManager.ConnectionStrings["EmployeeDatabase"].ConnectionString;
SqlConnection connection = new SqlConnection(connString);
connection.Open();
string cmdText = "INSERT INTO Employees VALUES(@EmpID, @FName, @LName, @City, @State)";
SqlCommand command = new SqlCommand(cmdText, connection);
command.CommandType = CommandType.Text;
command.Parameters.Add("@EmpID", SqlDbType.Int).Value = id;
command.Parameters.Add("@FName", SqlDbType.VarChar, 50).Value = fname;
command.Parameters.Add("@LName", SqlDbType.VarChar, 50).Value = lname;
command.Parameters.Add("@City", SqlDbType.VarChar, 20).Value = city;
command.Parameters.Add("@State", SqlDbType.VarChar, 5).Value = state;
command.ExecuteNonQuery();
}

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

aliyeh
دوشنبه 16 بهمن 1391, 10:59 صبح
ممنونم دوست عزیز ولی من می خوام که کاربر در همون گریدویو امکان ثبت و ویرایش موقت اطلاعات رو هم داشته باشه
میشه بگید چطور می تونم در روش سه لایه dataadapter رو کانفیگ کنم؟

alihassanabadi
دوشنبه 16 بهمن 1391, 11:43 صبح
بله
شما گفتین اول اطلاعات رو به صورت موقت به گرید اضافه میکنین
منم فکر کردم میخواین با زدن یک دکمه کل رکوردهای موقت ثبت بشن

میشه بگید چطور می تونم در روش سه لایه dataadapter رو کانفیگ کنم؟
یعنی چی واضح بگو؟
تو لایه دیتا از چی استفاده میکنی
linq,Adoو...؟

aliyeh
سه شنبه 17 بهمن 1391, 16:24 عصر
خوب فکر کنم متوجه شدم
اما یک مشکلی وجود داره
من اطلاعات رو از دیتابیس می خونم و اون هارو داخل دیتاست می ریزم.و محتویات دیتاست رو در گریدویو نشون میدم.
به این ترتیب که شما گفتید می تونم تغییرات رو ایجاد کنم یا رکورد جدید اضافه کنم.
اما برای حذف به مشکل بر می خورم.چون اگر رکوردی رو از دیتاست حذف کنم و دیتاست رو به طریقی که شما گفتید در دیتابیسم بریزم رکورد حذف شده از دیتاست همچنان در دیتابیس باقی می مونه