PDA

View Full Version : این خطا به چه معناست؟



rezaiy.ali
پنج شنبه 22 فروردین 1387, 15:01 عصر
زمانی که تعداد زیادی مقدار برای پرینت به کریستال ارسال می کنیم ایم پیغام نمایش داده میشه

A callback was made on a garbage collected delegate of type 'CrystalDecisions.ReportAppServer.DataSetConversio n!CrystalDecisions.ReportAppServer.DataSetConversi on.DataSetConverter+CrdbAdoPlusDelegate::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.

بعد از اینکه دکمه ادامه را می زنم به در خود برنامه در خطی که پارامتر ها را به کریستال پاس میده این خطا می گیره

Error in File C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\temp_8151fec9-a9a3-48ec-ba95-8871b6dba853 {9EFD26BF-A801-44DA-96FE-A15D1C884E2C}.rpt:
The request could not be submitted for background processing.

لطفا راهنمایی بفرمایید

علیرضا مداح
پنج شنبه 22 فروردین 1387, 15:31 عصر
سلام ،
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=135093&SiteID=1

hack.ir
پنج شنبه 22 فروردین 1387, 17:45 عصر
معنی خطا که واضحه.
توی دات نت هر شی یا متغیری reference count داره یعنی تو یه جدول تعداد جاهایی که از اون شی استفاده شده یادداشت میشه و وقتی آخرین reference از بین رفت اون شی کاندید حذف توسط garbage collector میشه و دیگه از کنترل برنامه نویس خارجه و معلوم نیست کی توسط garbage collector از حافظه پاک میشه.
کریستال ریپورت کلی کد unmanaged داره و شما یه object رو دادی بهش ولی reference اونو نگه نداشتی (مثلاً اون شی متغیر لوکال بوده و بعد کد شما از اون بخش به جای دیگری رفته و اتوماتیک دات نت اون شی رو کاندید حذف کرده) و حالا که کار کریستال تموم شده و مقدار مربوطه رو می خواد برگردونه دات نت نمی تونه شی مورد نظر رو پیدا کنه و این خطا رو می ده.
کلاً کریستال برای دات نت توصیه نمیشه و بهتره از managed reporting system ها مثل active report استفاده کنی.

موفق باشی

rezaiy.ali
شنبه 24 فروردین 1387, 09:15 صبح
حال به نظر شما من باید چی کار کنم
پروژه را کارفرما از من تحویل گرفته
این هم کد که به باگ می خوره


for (int i = 0; i < IdCheque.Length; i++)
{
//DataTable
DT.Clear();

icommand = newSqlCommand("EXEC MashhadSadaritFish '" + IdCheque[i].ToString() + "','" + AccountCombo.SelectedValue.ToString() + "'", scnConnection);
SqlDR = icommand.ExecuteReader();
DT.Load(SqlDR);
cheguePrint2Saderat1.Database.Tables["accounting_MashhadSadarit"].SetDataSource(DT);
string Daliy = MiladiToShamsi.CurrentDate().Substring(0, 4).ToString() + "/" + MiladiToShamsi.CurrentDate().Substring(4, 2).ToString() + "/" + MiladiToShamsi.CurrentDate().Substring(6, 2).ToString();
cheguePrint2Saderat1.SetParameterValue("Horof", ConvertNumberToHorof.Change2(DT.Rows[0]["Sum"].ToString()));
cheguePrint2Saderat1.SetParameterValue("Daliy", Date);
SqlDR.Close();
try
{
cheguePrint2Saderat1.PrintToPrinter(1, true, 1, 1);
SCOC.UpdatePrintCheque(Convert.ToInt32(IdCheque[i].ToString()), 1);
SCOC.SavePrintFishBank(Convert.ToInt32(IdCheque[i].ToString()), Convert.ToInt16(AccountCombo.SelectedValue.ToStrin g()));
}
catch
{
MsgBox.ShowMessage(1, "لطفا چاپگر خود را بررسی بفرمایید", "توجه", "تایید", "", "", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
return;
}
}

لطفا راهنمایی بفرمایید

hack.ir
شنبه 24 فروردین 1387, 21:38 عصر
از این کد چیز زیادی نمیشه فهمید. اگه مقدار بیشتری از کد رو میگذاشتید یا کامنت داشت بهتر بود.
اگه DT به شی کریستال اشاره می کنه باید یه رفرنس به اون رو نگهداری
شما (ممکنه مستقیماً این کارو نکرده باشی) یه delegate تعریف کردی که موقع بازگشت از کریستال garbage collector اونو جارو کرده و برده. خوب دات نت چیزی رو میده دست garbage collector که رفرنسی به اون وجود نداشته باشه. یه راه حل غیر علمی اینه که اشیاء مربوطه رو public تعریف کنی تا از بین نرن. این روش ممکنه کار کنه اما 100% مورد داره.

rezaiy.ali
یک شنبه 25 فروردین 1387, 09:35 صبح
پیش نهاد شما برای رفع اصولی این مشکل چیست؟