PDA

View Full Version : چطور در یه TransactionScope می شه کانکشن به یه SQLite رو باز کرد که اکسپشن نده



PetekDincos
چهارشنبه 22 شهریور 1391, 21:54 عصر
با سلام
من با استفاده از SQLite و EF یه مدل درست کردم و می خوام در داخل یه TransactionScope کانکشنی که به ایتن دیتابیس دارم رو باز کنم اما خطا می ده آیا دوستان راه حلی برای این موضوع سراغ دارند ممنون می شم راهنمایی کنند . با تشکر

FastCode
چهارشنبه 22 شهریور 1391, 22:36 عصر
یعنی چطوری؟
دو تا Connection به یک DB؟
چرا از همون Connection استفاده نمیکنید؟

PetekDincos
چهارشنبه 22 شهریور 1391, 23:27 عصر
با سلام
ببین من یه جدول دارم که یه فیلد identity داره و می خوام این فیلد رو وقتی که تولید شده در داخل TransactionScope در یه جدول دیگه استفاده کنم و چون SaveChange می کنم Connection بسته می شه در داخل ترنزکشن به خاطر همین در داخل Transaction می یام یه شرط قرار می دم که اگر Connection بسته باشه Conn رو باز کن و بقیه کار و این کار تو خود Sql Server به درستی جواب می ده اما تو این SQLite اکسپشن می ده با تشکر

FastCode
پنج شنبه 23 شهریور 1391, 01:27 صبح
لطفاً متن Exception رو بزارید و اگر امکان داره تکه کدی که خطا میده.اینطوری نمیشه نظر داد.بدتر گیج شدم.

یعنی دو تا insert ه وابسته رو در دو transaction انجام میدید؟

PetekDincos
پنج شنبه 23 شهریور 1391, 12:27 عصر
با سلام
این Exception رو می ده


The underlying provider failed on EnlistTransaction.

زمانیکه در دو تا جدول به صورت Master-Detail می خوام یه رکورد رو ذخیره کنم و متد مربوط به این کار به این صورت می باشد


public bool AddToRegMainDetail(MainReg MyMain, List<DetailReg> MyListDetail)
{
try
{
using (TransactionScope ts = new TransactionScope())
{
if (MyConn.Connection.State == ConnectionState.Closed)
MyConn.Connection.Open();
MyConn.MainReg.AddObject(MyMain);
MyConn.SaveChanges();
foreach (DetailReg item in MyListDetail)
{
item.Main_ID = MyMain.Main_ID;
MyConn.DetailReg.AddObject(item);
}
MyConn.SaveChanges();
ts.Complete();
}
if (MyConn.Connection.State == ConnectionState.Open)
MyConn.Connection.Close();
return true;
}
catch
{
}
if (MyConn.Connection.State == ConnectionState.Open)
MyConn.Connection.Close();
return false;
}


ممنون می شم راهنمایی بفرمایید . با تشکر

FastCode
پنج شنبه 23 شهریور 1391, 19:25 عصر
اگر ممکنه کد مربوط به MyConn.SaveChanges رو هم بزارید.این کد به نظر مشکلی نداره.

سعی کردید قبل از ایجاد ه TransactionScope
Connection رو باز کنید؟

یا پارامترهای سازنده ی TransactionScope رو عوض کنید؟

PetekDincos
پنج شنبه 23 شهریور 1391, 19:50 عصر
با سلام
MyConn همون کانشکنه که در سازنده کلاس یه آبجکت از اون ساخته می شه و SaveChange هم مال EF است و Transacton رو هم تغییر ندادم . با تشکر

FastCode
پنج شنبه 23 شهریور 1391, 22:00 عصر
با تحقیقی که من انجام دادم,Sqlite این نوع Transaction رو support نمیکنه.


اگر میخواهید کدتون رو خیلی تغییر ندید از این parameter ها برای Sqlite استفاده کنید.(برای MSSQL به هیچ عنوان استفاده نکنید.)
System.Transactions.IsolationLevel.ReadCommitted, TimeSpan.FromSeconds(30), false

EDIT:
این موضوع به حل مشکل شما ربطی نداره:
Sqlite در کل Transaction معمولی رو هم به زور پشتیبانی میکنه.و با switch ه SQLITE_THREADSAFE میشه multi-thread کامپایلش کرد.
در غیر این صورت در حالت default ش multi-thread هم نیست.

PetekDincos
جمعه 24 شهریور 1391, 10:11 صبح
با سلام
اولا این کد رو به عنوان پارامتر در Transaction استفاده کنم ؟
و ثانیا آیا راه دیگه ای برای اینکه بشه یه چنین کاری رو انجام داد تو SQLite وجود نداره چون من به خاطر این از Transaction استفاده می کنم که اگه اتفاقی افتاد و داده به صورت صحیح ذخیره نشد دیگه برای همشون Commit نشه و من برای حل مشکل مجبور شدم Transaction رو حذف کردم که اگه باشه خیلی بهتره . با تشکر

FastCode
جمعه 24 شهریور 1391, 22:42 عصر
فکر میکنم با mmaped file و COW(CopyOnWrite) بشه
نمیدونم چطوری ولی توی لینوکس با clone میشه.(توی .Net نمی دونم جواب میده یا نه ولی در برنامه های Native
performance ه فوق العاده خوبی داره)
توی ویندوز نمیدونم چطوری میشه.

متسفانه در این مورد نمیتونم کمکتون کنم چون توی .Net در مورد ه COW و mmap هیچ تجربه ای ندارم.

http://www.kernel.org/doc/man-pages/online/pages/man2/clone.2.html
نمیدونم ویندوز این مفهوم رو چطوری پیاده سازی میکنه ولی نمیشه نداشته باشه