PDA

View Full Version : مشکل در استفاده از ترانزکشن (Transaction)



mrali.jalali
جمعه 15 مرداد 1395, 09:16 صبح
سلام . من یک آرایه دارم که ردیف به ردیف داخل دیتابیس ثبت میشه . میخام موقه ثبت از ترانزکشن استفاده کنم. میخام اگر یکیش ثبت نشد بقیش هم ثبت نشه.
کد ثبت هم به صورت زیر می باشد :


private void ts_save_Click(object sender, EventArgs e)
{
using (TransactionScope ts = new TransactionScope())
{
try
{
int CountEdit = 0, CountNew = 0;
int r = 0;
foreach (var item in imageListView1.Items)
{
if (ArgDocPicsScan[r].TypeDoc == 0)//درصورتیکه در حالت جدید باشه
{

string LastDoc_id = PatientDocumentManager.InsertDocPatient(ArgDocPics Scan[r].DoctypeId, patid, PuplicFunc.ImageToByte(item.GetImage()), r.ToString(), ".jpg", '1', ArgDocPicsScan[r].DescDoc, DateTime.Now, frmSplash.UserName, 0);
ArgDocPicsScan[r].TypeDoc = 1;

LDEArchiveDataContext db = new LDEArchiveDataContext();
ArgDocPicsScan[r].DocId = LastDoc_id;// db.Tbl_Documents.Select(q => q.Doc_ID).Max().ToString();
item.Text = ArgDocPicsScan[r].DocId.ToString() + ".jpg";
CountNew++;
}
r++;

}

FarsiMessageBox.FarsiMessage.Msg("ثبت انجام شد" + Environment.NewLine + " تعداد اسناد جدید ثبت شده : " + CountNew.ToString() + Environment.NewLine + " تعداد اسناد ویرایش شده : " + CountEdit.ToString());
}
catch (Exception ex)
{

FarsiMessageBox.FarsiMessage.MsgError("ثبت انجام نشد " + Environment.NewLine + ex.Message.ToString()) ;

Transaction.Current.Rollback();
}
}


}









تابع مربوط به ثبت :



public static string InsertDocPatient(int DoctypeID,long PatId,byte[] Data,string DocFilename,string Extension,char Issheet,string DocDesc,
DateTime DoccreateDate, string CrateuserName,byte Zero)
{

LDEArchiveDataContext db = new LDEArchiveDataContext();
Tbl_Document PatDoc = new Tbl_Document();

PatDoc.Doc_TypeID = DoctypeID ;
PatDoc.Doc_PatID = PatId;
PatDoc.Doc_Data = Data;
PatDoc.Doc_FileName = DocFilename;
PatDoc.Doc_Extension = Extension;
PatDoc.Doc_IsSheet = Issheet;
PatDoc.Doc_Decsription = DocDesc;
PatDoc.Doc_CreateDate = DoccreateDate;
PatDoc.Doc_CreateUserName = CrateuserName;
db.Tbl_Documents.InsertOnSubmit(PatDoc);
db.SubmitChanges();
return (PatDoc.Doc_ID.ToString());
}





بدون استفاده از ترانزکشن ثبت انجام میشه و مشکل نداره .
ولی وقتی از ترانزکشن استفاده میکنم حلقه بار اول دستور insert رو رد میکنه و بار دوم وارد cath میشه و خطای زیر رو میده :

MSDTC on server 'PC1' is unavailable.


ممنون میشم راهنمایی کنید ..

ژیار رحیمی
شنبه 16 مرداد 1395, 15:11 عصر
دوست گرامی وقتی شما از LINQ to SQL استفاده کردی تمام رکورد ها رو به Context اضافه کن و فقط با یک بار فرا خوانی db.SubmitChanges() در خارج از حلقه تمام رکورد های اضافه شده به Context یکباره در دیتابیس نوشته میشود.اگرم خطایی در جایی رخ دهد هیچکدام از رکورد ها در دیتابیس نوشته نمیشوند.همانند ترانزاکشن سکوپ .مشابه کد زیر میتونی پیاده سازی کنی البته مقادیر رو اصلاح کنید


LDEArchiveDataContext db = new LDEArchiveDataContext();
foreach (var item in imageListView1.Items)
{
var PatDoc = new Tbl_Document();

PatDoc.Doc_TypeID =//مقدار;
PatDoc.Doc_PatID = //مقدار;
PatDoc.Doc_Data = //مقدار;
PatDoc.Doc_FileName = //مقدار;
PatDoc.Doc_Extension = //مقدار;
PatDoc.Doc_IsSheet = //مقدار;
PatDoc.Doc_Decsription = //مقدار;
PatDoc.Doc_CreateDate = //مقدار;
PatDoc.Doc_CreateUserName = //مقدار;
db.Tbl_Documents.Add(PatDoc);

}
db.SubmitChanges();

mrali.jalali
یک شنبه 17 مرداد 1395, 14:51 عصر
ممنون . ولی با این روش فانکشن InsertDocPatient (کلاس) میره کنار ؟ اگر چند لایه میخاستم بنویسم قسمت مربوط به ثبتش چی میشد

ژیار رحیمی
یک شنبه 17 مرداد 1395, 17:14 عصر
بله یه کلاس کمتر کد مینویسی. با تکنولوژی های LINQ To SQL ویا EntityFramework سه لایه نوشتن فقط نوشتن کد اضافی به همراه داره همین

mrali.jalali
یک شنبه 17 مرداد 1395, 20:34 عصر
دوست عزیز . این قسمت رو چرا من ندارم ؟ فضای نامی داره ؟
db.Tbl_Documents.Add(PatDoc)

Add رو نداره

ژیار رحیمی
دوشنبه 18 مرداد 1395, 15:12 عصر
عذر خواهی میکنم دوست گرامی Add متد Ef هست از متد InsertOnSubmit که مربوط به LINQ TO SQL هست استفاده کنید