PDA

View Full Version : مشکل با تراکنش به همراه DataReader



rasti_web
چهارشنبه 11 بهمن 1385, 11:19 صبح
من در برنامه ام از شی تراکنش استفاده کرده ام.میخواهم در قالب تراکنش مثلا یکسری تغییرات (مثل update,...) را در یک حلقه datareader اعمال کنم.ولی چون در حلقه هست نمیتوانم یک command جدید تعریف کنم.راه حل چیست؟


SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try
{
new SqlCommand( "INSERT INTO ....",db,transaction).ExecuteNonQuery();
SqlDataReader dr;
dr = new SqlCommand("SELECT ....",db,transaction).ExecuteReader();
while(dr.Read())
{
....
new SqlCommand("UPDATE ....",db,transaction).ExecuteNonQuery();
....
SqlCommand("SELECT ....",db,transaction).ExecuteReader();
.......
}
dr.close();
transaction.Commit();
}
catch{transaction.rollback();}
finally{}

rasti_web
یک شنبه 15 بهمن 1385, 07:58 صبح
مشکلم حل نشده کسی راه حلی نداره

DonetKarvb
یک شنبه 15 بهمن 1385, 08:24 صبح
میشه بگی دققا" میخوای چکار کنی؟

Alireza_Salehi
یک شنبه 15 بهمن 1385, 08:29 صبح
شما میتونی یک شی Command تعریف کنی و در هر مرحله مقدار CommandText اون رو عوض کنی !


SqlCommand cmd = new SqlCommand("ًُYour Query", db, transaction);
while(dr.Read())
{
cmd.CommandText = "Your New Query";
cmd.ExecuteNonQuery();
}قبل از اجرای حلقه تعریف کن ، در داخل حلقه مقدار CommandText رو تغییر بده!

البته نمیدونم ساختار دیتابیس شما چطوریه ولی احتمالا راه بهتری به جای استفاده از حلقه وجود داره. اگر دقیقا بگی چی کار می خوای بکنی شاید بهتر بتونیم کمکت کنیم.

rasti_web
یک شنبه 15 بهمن 1385, 12:30 عصر
با تشکر از راهنمایی شما روش پیشنهادی شما را هنوز تست نکرده ام و روند کلی پروژه من به این صورت است :
من یک برنامه فروشگاه کارت نوشته ام . در این برنامه :
کاربران سیستم برای خرید کردن باید عضو بوده و لاگین نمایند . بعد از اتمام خرید و پرداخت پول با یک تراکنش باید مراحل زیر انجام شود :
1.خرید های کاربر از سبد خرید کاربر به جدول خرید کاربر منتقل شود .
2.به تعداد کارتهای خریداری شده از تعداد کل کارت ها کسر گردد .
3.به تعداد کارت خریداری شده شناسه و پسورد از جدول کارت برداشته شود .
4.مشخصات کارتهای خریداری شده را به جدول جزئیات خرید کاربر اضافه کنیم .

مراحل 2 تا 4 به ازای هر خرید کاربر تکرار می شود .( یعنی در حلقه DataReader این مراحل تکرار می شود )

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

روش تغییر CommandText را هم تست کرده و نتیجه رو اعلام می کنم .
ممنونم

rasti_web
سه شنبه 17 بهمن 1385, 10:13 صبح
کد رو به صورت زیر اصلاح کردم :


SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand( "INSERT INTO ....",db,transaction);
cmd.ExecuteNonQuery();
SqlDataReader dr;
dr = cmd.CommandText("SELECT ....");
cmd.ExecuteReader();
while(dr.Read())
{
....
cmd.CommandText("UPDATE ....");
cmd.ExecuteNonQuery();
....
cmd.CommandText("SELECT ....");
cmd.ExecuteReader();
.......
}
dr.close();
transaction.Commit();
}
catch{transaction.rollback();}
finally{}

خطای زیر را میدهد :


There is already an open DataReader associated with this Connection which must be closed first.

rasti_web
چهارشنبه 18 بهمن 1385, 07:51 صبح
مشکل رو چطوری حل کنم ؟

Alireza_Salehi
چهارشنبه 18 بهمن 1385, 12:48 عصر
به نظر من اگر می خواهی چندین عمل (مشابه و مرتبط) روی دیتابیس انجام بدی از StoredProcedure استفاده کن !
خیلی بهتره ، مثلا اون دوتا عمل درون حلقه رو می تونی به که SP تبدیل کنی.

به یک کانکشن نمیشه چند تا دیتاریدر نسبت داد برای عملیات درون حلقه یک کانکشن جدید تعریف کنید!

ali_kolahdoozan
چهارشنبه 18 بهمن 1385, 14:27 عصر
شما یا باید از تراکنشها استفاده کنی . که در اینجا اتفاقا می تونی یا از sp ها . درون sp همه این کارها رو میتونی با هم انجام بدی . با تراکنش اگر بری باید همش با یک کانکشن باشه و این شاید کار سختی از آب در بیاد .

rasti_web
شنبه 28 بهمن 1385, 08:34 صبح
آیا sp میتونه کار transaction را انجام بده ؟

once4ever
شنبه 28 بهمن 1385, 09:04 صبح
مزیت استفاده از StoredProcedure چیه؟ (ببخشید اما شاید ربط داشته باشه)

rasti_web
سه شنبه 01 اسفند 1385, 08:46 صبح
آیا sp میتونه کار transaction را انجام بده ؟

Alireza_Salehi
سه شنبه 01 اسفند 1385, 09:58 صبح
حتما می تونه اگر کار به این سادگی رو DBMS (http://www.microsoft.com/sql/default.mspx) نتونه انجام بده که به هیچ دردی نمی خوره!

Transactions (Transact-SQL) (http://msdn2.microsoft.com/en-us/library/ms174377.aspx)


در واقع این شی SqlTransaction (http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx) در دات نت از همین امکانات DBMS (http://www.microsoft.com/sql/default.mspx) استفاده میکنه.

rasti_web
سه شنبه 01 اسفند 1385, 12:50 عصر
من چه جوری میتونم از stored procedure استفاده کنم؟من هنوز با sp ها کار نکرده ام.

Alireza_Salehi
سه شنبه 01 اسفند 1385, 13:32 عصر
من چه جوری میتونم از stored procedure استفاده کنم؟من هنوز با sp ها کار نکرده ام.

اگر نحوه استفادش رو بخوای
یک شی Command تعریف میکنی ، CommandType رو برابر StoredProcedure قرار میدی CommandText رو برابر با نام SP قرار میدی و با خاصیت Parameters و متد Add این خاصیت شی Command پارمترها رو بهش میدی برای اجرا هم متد ExecuteNonQuery شی Command رو اجرا میکنی!

اگر هم تو نوشتن خود SP مشکل داری تالار SQL Server (http://www.barnamenevis.org/forum/forumdisplay.php?f=21) جستجوکن یا این CREATE PROCEDURE (Transact-SQL) (http://msdn2.microsoft.com/en-us/library/ms187926.aspx) لینک رو ببین!

rasti_web
چهارشنبه 02 اسفند 1385, 08:13 صبح
استفاده از تراکنش به این دلیل است که اگر یکی از دستورات انجام نشود کل دستورات rollback میشود و به حالت اولیه برمیگردد این برای کاری که من میخوام خیلی خیلی مهم است.آیا sp ها هم مثل تراکنش عمل میکند.

Alireza_Salehi
چهارشنبه 02 اسفند 1385, 08:38 صبح
استفاده از تراکنش به این دلیل است که اگر یکی از دستورات انجام نشود کل دستورات rollback میشود و به حالت اولیه برمیگردد این برای کاری که من میخوام خیلی خیلی مهم است.آیا sp ها هم مثل تراکنش عمل میکند.

شما یه SP مینویسی داخلش با BeginTransaction ، Commit ، RollBack همون قابلیت های شی SqlTransaction در دات نت رو و خیلی کارهای دیگه رو میتونی پیاده سازی کنی!

Transactions (Transact-SQL) (http://msdn2.microsoft.com/en-us/library/ms174377.aspx)


این لینک رو با دقت ببین مثال هم توش داره ، اطلاعات بیشتر می خوای تو تالار SQL جستجو کن اونجا بهتر کمکت میکنند.

در ضمن مزیت SP اینه که دیگه کانکشن و این اشیا دات نت رو لازم نداره مستقیم تو خود دیتابیس کار میکنی نشتن کوئری های پیچیده هم خیلی راحت تره!

اَرژنگ
چهارشنبه 02 اسفند 1385, 08:51 صبح
استفاده از تراکنش به این دلیل است که اگر یکی از دستورات انجام نشود کل دستورات rollback میشود و به حالت اولیه برمیگردد این برای کاری که من میخوام خیلی خیلی مهم است.آیا sp ها هم مثل تراکنش عمل میکند.

در نت ۲.۰ از تراکنش استفاده کنید .وقتت را تلف نوشتن کد در SQL نمیکنید.

rasti_web
چهارشنبه 02 اسفند 1385, 09:11 صبح
از جوابتون ممنون.من پاسخ شما را بررسی میکنم در صورت داشتن مشکل از تون کمک میگیرم

rasti_web
چهارشنبه 02 اسفند 1385, 13:03 عصر
Transactions (Transact-SQL)
این لینک مربوط به SQL Server 2005 است . من با SQL Server 2000 کار میکنم !

اَرژنگ
چهارشنبه 02 اسفند 1385, 13:33 عصر
Transactions (Transact-SQL)
این لینک مربوط به SQL Server 2005 است . من با SQL Server 2000 کار میکنم !
یک دلیل دیگر برایه استفاده از تراکنش، فرق نمیکنه با ۲۰۰ کار کنید و یا ۲۰۰۵.

rasti_web
چهارشنبه 02 اسفند 1385, 13:40 عصر
من دات نت 1.1 کار میکنم.چون میخواهم تراکنش در حلقه reader اجرا شود و با یک کانکشن است استفاده از تراکنش خطا میدهد.

rasti_web
پنج شنبه 03 اسفند 1385, 12:33 عصر
من نمیتونم این مشکل رو حل کنم !!!!!!!!!!!!!!!! کسی نمیتونه تغییر این کد رو با SP برام بنویسه ؟
( اگه با تغییر کد تراکنش کارها همزمان انجام میشه )
یه دنیا ممنون میشم ...................