PDA

View Full Version : اجراي همزمان چند دستور Insert مرتبط



h_r_sh
سه شنبه 04 فروردین 1388, 02:50 صبح
سلام
قراره كه سه تا دستور Insert اجرا بشن. اما اگه هر كدوم از دستورها به هر دليلي انجام نشد، تغييرات انجام شده در ساير دستورات هم لغو بشن. يعني اگه دستور اول مقادير مورد نظر رو ثبت كرد، دستور دوم با اشكال مواجه شد و بالاخره دستور سوم مقادير مورد نظر رو ثبت كرد، به دليل اينكه دستور دوم انجام نشده، دستورات اول و سوم هم Rollback بشن.
مشكلم اينجاست كه كل برنامه در سه لايه نوشته شده و نمدونم چطور Transaction ها رو در آخرين لايه مديريت كنم. يعني بگم Commit بشن يا Rollback ؟
ممنون مي شم اگه كسي در اين مورد راهنمايي كنه

اوبالیت به بو
سه شنبه 04 فروردین 1388, 03:46 صبح
مشكلم اينجاست كه كل برنامه در سه لايه نوشته شده و نمدونم چطور Transaction ها رو در آخرين لايه مديريت كنم. يعني بگم Commit بشن يا Rollback ؟
ممنون مي شم اگه كسي در اين مورد راهنمايي كنه
برنامه رو اينجا قرار بدين.

h_r_sh
سه شنبه 04 فروردین 1388, 18:34 عصر
با تشكر از دوست عزيز، سورس برنامه كه البته ناقصه، مي ذارم. لطف مي كنيد اگه يه نگاه بهش بكنيد. مشكلي كه گفتم در قسمت زير هست:


frmEmploeeManager

private void btnAdd_Click(object sender, EventArgs e)


لطفا بعد از extract كردن، پوشه ي resources را درون پوشه ي Haser_App كپي كنيد


با سپاس
http://cid-2b4b76299f8255ed.skydrive.live.com/browse.aspx/.Public/My%20Jobs?uc=4

SMRAH1
سه شنبه 04 فروردین 1388, 18:45 عصر
در هر لایه،در متدی که داره قسمتی از کد را اجرا میکند،باید این متد رو طوری تعریف کنی که در بازگشتی اون بتونی تشخیص بدی که تابع کامل اجرا شده یا نه.مثلا باید خروجی متدت bool باشه و اگر true بود یعنی کار با موفقیت انجام شده و .....
در ضمن تا اونجایی که من اطلاع دارم،در برنامه چند لایه،تمام دستورات مثل هم (مثلا تمام تغییرات در پایگاه داده) در یک لایه پیاده سازی می شه.

h_r_sh
سه شنبه 04 فروردین 1388, 18:50 عصر
با تشكر از حسن نظر شما، تمام دستورات مشابه در يك لايه هستند. اما مثلا بعد از اتفاق افتادن عمل كليك هست كه سه تا دستور Insert اجرا مي شن. اينجا نمي دونم چه كار كنم. اگه بنا به نظر شما تابع اضافه كردن از نوع بازگشتي bool باشه و دستور اول و دوم اجرا بشن و دستور سوم اجرا نشه، و مقدار false رو برگردونه، چطور اعمال انجام شده در دستورات اول و دوم رو برگردونم؟

اوبالیت به بو
سه شنبه 04 فروردین 1388, 21:18 عصر
برنامه رو لطفاً همين جا آپلود كنيد.
شما در DAL پروژه يك region مي سازيد مخصوص اين كار كه شامل سه تا متد ميشه:

يه متد براي BeginTranse
يه متد براي Commit
يه متد هم براي Rollback
حالا در BLL پروژه اين sqlCommand رو به اين متد ها پاس بديد.

ahmadr
سه شنبه 04 فروردین 1388, 21:45 عصر
جناب h_r_sh دلیل این کارتو بگو شاید یه راه حل بهتری پیدا شد.

h_r_sh
سه شنبه 04 فروردین 1388, 23:36 عصر
اول - با عرض معذرت فراوان، هر كاري كردم براي ضميمه ي فايلها در همين قسمت نمي شد. حجمشون هم از حد مجاز كمتر بود ولي نشد به ناچار يه جاي ديگه گذاشتم. باز هم تلاش مي كنم. با تشكر از پي گيري شما.
كدهاي مربوط به همين دستورات رو كه در كلاسهاي جدا نوشتم، ببينيد لطفا:
DAL - Details



using System;
using System.Collections.Generic;
using System.Text;

namespace Haser_App.DAL
{
public class EmploeeDetails
{
public EmploeeDetails() { }
public EmploeeDetails(int nid,string id, string name, string family, string fname, string idno, string nidno,
string bdate, string phone, string mobile, string address, string mail, bool pic,bool present,
string lastcert,string lastcertdate,string diplomdate,string tahol,string childno,string khedmat,
string takafol,string grade,string start,string remark,string username,string pass,bool usertype)
{
this.nID = nid;
this.UserID = id;
this.UserName = name;
this.UserFamily = family;
this.UserFatherName = fname;
this.UserIdentificationNo = idno;
this.UserNationalCode = nidno;
this.UserBirthDate = bdate;
this.UserPhoneNo = phone;
this.UserMobileNo = mobile;
this.UserAddress = address;
this.UserEmailAddress = mail;
this.HasPicture = pic;
this.LastCertification = lastcert;
this.LastCertificationDate = lastcertdate;
this.DiplomeDate = diplomdate;
this.Taahol = tahol;
this.ChildrenNo = childno;
this.Khedmat = khedmat;
this.Takafol = takafol;
this.Organizationgrade = grade;
this.StartDate = start;
this.Remark = remark;
this.IsPresent = present;
this.UserLogName = username;
this.UserLogPassword = pass;
this.IsAdmin = usertype;
}
#region "Private Fields"
private int _nid = 0;
private string _id = "";
private string _name = "";
private string _family = "";
private string _fname = "";
private string _idno = "";
private string _nidno = "";
private string _bdate = "";
private string _phone = "";
private string _mobile = "";
private string _address = "";
private string _mail = "";
private bool _pic = false;
private bool _present = false;
private string _lastcert = "";
private string _lastcertdate = "";
private string _diplomedate = "";
private string _tahol = "";
private string _childno = "";
private string _khedmat = "";
private string _takafol = "";
private string _grade = "";
private string _start = "";
private string _remark = "";
private string _username = "";
private string _password = "";
private bool _usertype = false;
#endregion

#region "Public Peropery"
public int nID
{
get { return _nid; }
set { _nid = value; }
}
public string UserID
{
get { return _id; }
set { _id = value; }
}
public string UserName
{
get { return _name; }
set { _name = value; }
}
public string UserFamily
{
get { return _family; }
set { _family = value; }
}
public string UserFatherName
{
get { return _fname; }
set { _fname = value; }
}
public string UserIdentificationNo
{
get { return _idno; }
set { _idno = value; }
}
public string UserNationalCode
{
get { return _nidno; }
set { _nidno = value; }
}
public string UserBirthDate
{
get { return _bdate; }
set { _bdate = value; }
}
public string UserPhoneNo
{
get { return _phone; }
set { _phone = value; }
}
public string UserMobileNo
{
get { return _mobile; }
set { _mobile = value; }
}
public string UserAddress
{
get { return _address; }
set { _address = value; }
}
public string UserEmailAddress
{
get { return _mail; }
set { _mail = value; }
}
public bool HasPicture
{
get { return _pic; }
set { _pic = value; }
}
public bool IsPresent
{
get { return _present; }
set { _present = value; }
}
public string LastCertification
{
get { return _lastcert; }
set { _lastcert = value; }
}
public string LastCertificationDate
{
get { return _lastcertdate; }
set { _lastcertdate = value; }
}
public string DiplomeDate
{
get { return _diplomedate; }
set { _diplomedate= value; }
}
public string Taahol
{
get { return _tahol; }
set { _tahol = value; }
}
public string ChildrenNo
{
get { return _childno; }
set { _childno = value; }
}
public string Khedmat
{
get { return _khedmat; }
set { _khedmat = value; }
}
public string Takafol
{
get { return _takafol; }
set { _takafol = value; }
}
public string Organizationgrade
{
get { return _grade; }
set { _grade = value; }
}
public string StartDate
{
get { return _start; }
set { _start = value; }
}
public string Remark
{
get { return _remark; }
set { _remark = value; }
}
public string UserLogName
{
get { return _username; }
set { _username = value; }
}
public string UserLogPassword
{
get { return _password; }
set { _password = value; }
}
public bool IsAdmin
{
get { return _usertype; }
set { _usertype = value; }
}
#endregion

}
}
DAL - DataAccess



using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using System.Windows.Forms;
using Haser_App.DAL;

namespace Haser_App.DAL.Sql
{
public class emploeeDataAccess
{
protected string connectionString = "";
private string error = Haser_App.Properties.Resources.InsertError;
public emploeeDataAccess()
{
connectionString = Haser_App.Properties.Settings.Default.conStr;
}
public void InsertNewEmploee(EmploeeDetails objEmploee)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlParameter[] param = new SqlParameter[14];
param[0] = new SqlParameter("@u_vid", SqlDbType.NVarChar);
param[0].Value = objEmploee.UserID;
param[1] = new SqlParameter("u_name", SqlDbType.NVarChar);
param[1].Value = objEmploee.UserName;
param[2] = new SqlParameter("@u_family", SqlDbType.NVarChar);
param[2].Value = objEmploee.UserFamily;
param[3] = new SqlParameter("@u_fathername", SqlDbType.NVarChar);
param[3].Value = objEmploee.UserFatherName;
param[4] = new SqlParameter("@u_idno", SqlDbType.NVarChar);
param[4].Value = objEmploee.UserIdentificationNo;
param[5] = new SqlParameter("@u_nidno", SqlDbType.NVarChar);
param[5].Value = objEmploee.UserNationalCode;
param[6] = new SqlParameter("@u_birthdaydate", SqlDbType.NVarChar);
param[6].Value = objEmploee.UserBirthDate;
param[7] = new SqlParameter("@u_phone", SqlDbType.NVarChar);
param[7].Value = objEmploee.UserPhoneNo;
param[8] = new SqlParameter("@u_mobile", SqlDbType.NVarChar);
param[8].Value = objEmploee.UserMobileNo;
param[9] = new SqlParameter("@u_address", SqlDbType.NVarChar);
param[9].Value = objEmploee.UserAddress;
param[10] = new SqlParameter("@u_mail", SqlDbType.NVarChar);
param[10].Value = objEmploee.UserEmailAddress;
param[11] = new SqlParameter("@u_haspic", SqlDbType.Bit);
param[11].Value = objEmploee.HasPicture;
param[12] = new SqlParameter("@u_present", SqlDbType.Bit);
param[12].Value = objEmploee.IsPresent;
param[13] = new SqlParameter("@u_id", SqlDbType.Int);
param[13].Value = objEmploee.nID;
SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, "sp_addEmploee", param);
}
catch (Exception ex)
{
MessageBox.Show(error + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
}
finally
{
connection.Close();
}
}
}
public void InsertNewEmploeeDetails(EmploeeDetails objEmploee)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlParameter[] param = new SqlParameter[11];
param[0] = new SqlParameter("@u_vid", SqlDbType.NVarChar);
param[1] = new SqlParameter("@u_lastcert", SqlDbType.NVarChar);
param[2] = new SqlParameter("@u_lastcertdate", SqlDbType.NVarChar);
param[3] = new SqlParameter("@u_diplomdate", SqlDbType.NVarChar);
param[4] = new SqlParameter("@u_tahol", SqlDbType.NVarChar);
param[5] = new SqlParameter("@u_childno", SqlDbType.NVarChar);
param[6] = new SqlParameter("@u_khedmat", SqlDbType.NVarChar);
param[7] = new SqlParameter("@u_takafol", SqlDbType.NVarChar);
param[8] = new SqlParameter("@u_grade", SqlDbType.NVarChar);
param[9] = new SqlParameter("@u_start", SqlDbType.NVarChar);
param[10] = new SqlParameter("@u_remark", SqlDbType.NVarChar);
param[0].Value = objEmploee.UserID;
param[1].Value = objEmploee.LastCertification;
param[2].Value = objEmploee.LastCertificationDate;
param[3].Value = objEmploee.DiplomeDate;
param[4].Value = objEmploee.Taahol;
param[5].Value = objEmploee.ChildrenNo;
param[6].Value = objEmploee.Khedmat;
param[7].Value = objEmploee.Takafol;
param[8].Value = objEmploee.Organizationgrade;
param[9].Value = objEmploee.StartDate;
param[10].Value = objEmploee.Remark;
SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, "sp_addEmploeeDetails", param);
}
catch (Exception ex)
{
MessageBox.Show(error + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
}
finally
{
connection.Close();
}
}
}
public void InsertNewEmploeeLogData(EmploeeDetails objEmploee)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlParameter[] param = new SqlParameter[4];
param[0] = new SqlParameter("@u_vid", SqlDbType.NVarChar);
param[1] = new SqlParameter("@u_username", SqlDbType.NVarChar);
param[2] = new SqlParameter("@u_password", SqlDbType.NVarChar);
param[3] = new SqlParameter("@u_type", SqlDbType.NVarChar);
param[0].Value = objEmploee.UserID;
param[1].Value = objEmploee.UserLogName;
param[2].Value = objEmploee.UserLogPassword;
param[3].Value = objEmploee.IsAdmin;
SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, "sp_addEmploeeLogData", param);
}
catch (Exception ex)
{
MessageBox.Show(error + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
}
finally

{

connection.Close();
}
}
}
}
}

كه هر سه دستور Insert رو همينجا گذاشتم


BLL



using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using Haser_App.DAL;
using Haser_App.DAL.Sql;

namespace Haser_App.BLL
{
public class Emploee
{
private string errorMessage = Haser_App.Properties.Resources.InsertError;

/// <summary>
/// Insert new emploee details to emploee list
/// </summary>
/// <param name="emploeeFields">Prepair emploee details list</param>
public void AddNewEmploee(EmploeeDetails emploeeFields)
{
try
{
emploeeDataAccess emploeeDAL = new emploeeDataAccess();
emploeeDAL.InsertNewEmploee(emploeeFields);
}
catch (Exception ex)
{
MessageBox.Show(errorMessage + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.RtlReading);
}
}
/// <summary>
/// Insert new emploee details to emploee list
/// </summary>
/// <param name="emploeeFields">Prepair emploee details list</param>
public void AddNewEmploeeDetails(EmploeeDetails emploeeFields)
{
try
{
emploeeDataAccess emploeeDAL = new emploeeDataAccess();
emploeeDAL.InsertNewEmploeeDetails(emploeeFields);
}
catch (Exception ex)
{
MessageBox.Show(errorMessage + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.RtlReading);
}
}
public void AddNewEmploeeLogData(EmploeeDetails emploeeFields)
{
try
{
emploeeDataAccess emploeeDAL = new emploeeDataAccess();
emploeeDAL.InsertNewEmploeeLogData(emploeeFields);
}
catch (Exception ex)
{
MessageBox.Show(errorMessage + "\n" + ex.Message + "\n" + ex.Source.ToString(), "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.RtlReading);
}
}
}
}


متاسفانه به دليل بي تجربگي، نفهميدم كه چطور BeginTrans / Commit / Rollback رو بنويسم. اگه امكان داره يه مقدار بيشتر راهنمايي كنيد.

دوم - اصل مسئله اينه:
يه فرم براي ثبت نام كارمندها دارم.
اولين دستور اطلاعات شخصي رو وارد يه جدول مي كنه.
دومين دستور اطلاعات پرسنلي رو وارد يه جدول ديگه مي كنه.
سومين دستور اطلاعات كاربري سيستم براي همون كارمند رو وارد يه جدول ديگه مي كنه.
همه ي اين اطلاعات يا بايد وارد جداول مربوطه بشن يا هيچكدوم.

h_r_sh
سه شنبه 04 فروردین 1388, 23:41 عصر
متاسفانه نمي شه فايل Upload كرد. چرا؟

*unos*
چهارشنبه 05 فروردین 1388, 09:54 صبح
دوست عزیز بهتر نیست شما این سه insert رو داخل stored procedure بنویسین البته داخل بلوک tran.
هر جای کار هم به مشکل برخوردید راحت roolback می کنید

SMRAH1
چهارشنبه 05 فروردین 1388, 14:52 عصر
این سه تابع رو طوری برنامه ریزی کن که Connection شون رو بگیرند (یک متغیر ورودی به تابع باید اضافه کنی) و بعد توسط همون Connection دستور رو اجرا کنند.حالا قبل از اجرا این سه (یا چند تابع) یک Connection ساخته و متد BeginTransaction اون رو فراخوانی کرده (این تابع یک شی Transaction بر می گردونی) و بعد یک یک توابع رو با اون اجرا می کنی.در نهایت اگر کار درست بود که COmmit می کنی و در غیر این صورت Rollback می کنی (این توابع رو باید در شی Transaction فراخوانی کنی).
می تونی سه تابع رو طوری برنامه یزی کنی که اگر COnnection بهشون ندادی،خودشون اقدام به ساخت Connection کنند در غیر اینصورت از Connection در یافتی استفاده کنند و ...

موفق باشی

amin_alexi
چهارشنبه 05 فروردین 1388, 18:22 عصر
یک راهم من پیشنهاد میدم
اگه از SQL Server 2008 استفاده می کنی !!
می تونی کل سه سطر رو به عنوان یک DataTable در بیاری و به StoreProcedure بفرستی !
نکته : در SQL 2008 یک Sp می تونه یک متغییر از نوع Table رو به عنوان ورودی دریافت کنه و شما می تونید با دستورات زیر کار رو انجام بدین !

CREATE PROC sp_InsertDetail
@Param1 Detail READONLY
AS
INSERT Orders SELECT * FROM @Param1

@Param1 Detail در این دستور Detail نام جدول مورد نظر !
در این حالت هر تعداد سطر که باشه به عنوان یک TransAction در نظر گرفته میشه ...
از داخل برنامه هم وقتی Sp رو فراخوانی میکنی کافیه به جای پارامتر ورودی Sp که از نوع جدول Detail هست DataTable بفرستی !

h_r_sh
پنج شنبه 06 فروردین 1388, 02:37 صبح
این سه تابع رو طوری برنامه ریزی کن که Connection شون رو بگیرند (یک متغیر ورودی به تابع باید اضافه کنی) و بعد توسط همون Connection دستور رو اجرا کنند.حالا قبل از اجرا این سه (یا چند تابع) یک Connection ساخته و متد BeginTransaction اون رو فراخوانی کرده (این تابع یک شی Transaction بر می گردونی) و بعد یک یک توابع رو با اون اجرا می کنی.در نهایت اگر کار درست بود که COmmit می کنی و در غیر این صورت Rollback می کنی (این توابع رو باید در شی Transaction فراخوانی کنی).
می تونی سه تابع رو طوری برنامه یزی کنی که اگر COnnection بهشون ندادی،خودشون اقدام به ساخت Connection کنند در غیر اینصورت از Connection در یافتی استفاده کنند و ...

موفق باشی

با تشكر از نظر مثبت شما. من كدهاي مربوط به اين دستورها رو همينجا (صفحه ي قبل ) گذاشتم. مي خواستم خواهش كنم اگه امكان داره روي كدها روشي رو كه فرموديد يه كم بيشتر توضيح بديد.

با احترام

h_r_sh
پنج شنبه 06 فروردین 1388, 02:38 صبح
یک راهم من پیشنهاد میدم
اگه از SQL Server 2008 استفاده می کنی !!
می تونی کل سه سطر رو به عنوان یک DataTable در بیاری و به StoreProcedure بفرستی !
نکته : در SQL 2008 یک Sp می تونه یک متغییر از نوع Table رو به عنوان ورودی دریافت کنه و شما می تونید با دستورات زیر کار رو انجام بدین !

CREATE PROC sp_InsertDetail
@Param1 Detail READONLY
AS
INSERT Orders SELECT * FROM @Param1
@Param1 Detail در این دستور Detail نام جدول مورد نظر !
در این حالت هر تعداد سطر که باشه به عنوان یک TransAction در نظر گرفته میشه ...
از داخل برنامه هم وقتی Sp رو فراخوانی میکنی کافیه به جای پارامتر ورودی Sp که از نوع جدول Detail هست DataTable بفرستی !

از راهنمايي شما سپاسگذارم. من از SQL Server 2005 استفاده مي كنم. اما به هر حال ممنون از لطف شما.

*unos*
پنج شنبه 06 فروردین 1388, 08:39 صبح
این سه تابع رو طوری برنامه ریزی کن که Connection شون رو بگیرند (یک متغیر ورودی به تابع باید اضافه کنی) و بعد توسط همون Connection دستور رو اجرا کنند.حالا قبل از اجرا این سه (یا چند تابع) یک Connection ساخته و متد BeginTransaction اون رو فراخوانی کرده (این تابع یک شی Transaction بر می گردونی) و بعد یک یک توابع رو با اون اجرا می کنی.در نهایت اگر کار درست بود که COmmit می کنی و در غیر این صورت Rollback می کنی (این توابع رو باید در شی Transaction فراخوانی کنی).
می تونی سه تابع رو طوری برنامه یزی کنی که اگر COnnection بهشون ندادی،خودشون اقدام به ساخت Connection کنند در غیر اینصورت از Connection در یافتی استفاده کنند و ...




private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();

SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;

// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");

// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;

try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();

// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);

// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
}

h_r_sh
جمعه 07 فروردین 1388, 17:58 عصر
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();

SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;

// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");

// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;

try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();

// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);

// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
}


با تشكر از شما. اگه متدهاي Commit ويا Rollback در لايه ي ديگري از برنامه بخوان اجرا بشن چي؟

*unos*
شنبه 08 فروردین 1388, 11:08 صبح
این برنامرو نگاه کنید

mahere 2008
دوشنبه 10 فروردین 1388, 18:06 عصر
برنامه ی شما که دارای دو دستور insert می باشد دو تا رکورد ایجاد می کند
من می خواهم فیلدهای یک رکورد را با چند دستور insert پر کنم .اما هنگامی که ازچند دستور insert استفاده می کنم چند رکورد جداگانه ایجاد می کند.لطفا مرا راهنمایی کنید.:متفکر:

h_r_sh
دوشنبه 10 فروردین 1388, 19:20 عصر
فكر كنم بايد بجاي Insert از Update استفاده كني.

hdv212
دوشنبه 10 فروردین 1388, 19:37 عصر
در دات نت 2 به بالا، namespace ای وجود داره به نام System.Transactions که باید به پروژه تون اضافه کنید، در این فضای نام، کلاسی هست به نام TransactionScope که میتونید هر دستوری رو در برنامه تون در داخل Transaction اجرا کنید!
اینم یه نمونه مثال :


System.Transactions.TransactionOptions trOptions = new System.Transactions.TransactionOptions();
trOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
trOptions.Timeout = new TimeSpan(0, 0, 15);
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope(System.Transa ctions.TransactionScopeOption.Required, trOptions))
{
using (SqlConnection con = new SqlConnection("data source=.;initial catalog=test;Trusted_Connection=Yes"))
{
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "Your First Command";
con.Open();

try
{
// Execute multiple command inside a single transaction

ts.Complete();
con.Close();
}
catch (Exception ex)
{
// Rollback current transaction
Transaction.Current.Rollback();
MessageBox.Show(ex.Message);
}
}
}

موفق باشید

rezatati
دوشنبه 10 فروردین 1388, 23:36 عصر
با سلام خدمت دوست عزیر
من خودم هم با یک چنین مشکلی مواجه بودم و البته دقیق کد شما را مطالعه نکردم ولی من هم باید دو Insert رو انجام می دادم که روش حل من اینگونه بود که در تابع یا کلاس اول که می خواستم عملیات رو انجام بدم کلید اصلی رکوردهایی که به پایگاه داده اضافه می شدند رو توی یک چنین چیزی نگه می داشتم



List<int> sIDs=new List<int>();

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

*unos*
سه شنبه 11 فروردین 1388, 12:39 عصر
برنامه ی شما که دارای دو دستور insert می باشد دو تا رکورد ایجاد می کند
من می خواهم فیلدهای یک رکورد را با چند دستور insert پر کنم .اما هنگامی که ازچند دستور insert استفاده می کنم چند رکورد جداگانه ایجاد می کند.لطفا مرا راهنمایی کنید.:متفکر:

این شکلی مشکلت حل میشه


try
{
command.CommandText =
"Insert into t (f1,f2,f3) VALUES ('1','0','0')";
command.ExecuteNonQuery();
command.CommandText =
"update t set f2='x',f3='y' where f1='1'";
command.ExecuteNonQuery();

trans_instance.commit_m();
MessageBox.Show("Both records are written to database.");
}