PDA

View Full Version : سوال: خطای NullReferenceException در کامپیوتر مشتری



shaho.khedri
چهارشنبه 29 فروردین 1397, 15:27 عصر
سلام
برنامه ای برای مشتری نوشته شده که روی سیستم خودم درست کار میکنه ولی در کامپیوتر مشتری خطای NullReferenceException رو با مضمون Object reference not set to an instance of an object. میاره.
البته در قسمتی از کد که هندل نکردم اکسپشن رو. خطا هم هنگام ویرایش سلولی از DGV ظاهر میشه (همون رویداد CellEndEdit)
متاسفانه چون مشتری در شهر دیگه ای زندگی میکنه برام میسر نیست کدم رو خط به خط روی سیستمشون اجرا کنم.
تنها مشکلی که به ذهنم میرسه تفاوت دات نت فریم ورک هستش همونطور که خود ارور میگه توی یکی از اسمبل ها:

Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0


و البته متن کامل ارور هم به این شکل هستش:

See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box.


************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at H.I.S.form.frmTimingAssign.dgReception_CellEndEdit (Object sender, DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnCellEndEdit(Da taGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.EndEdit(DataGrid ViewDataErrorContexts context, DataGridViewValidateCellInternal validateCell, Boolean fireCellLeave, Boolean fireCellEnter, Boolean fireRowLeave, Boolean fireRowEnter, Boolean fireLeave, Boolean keepFocus, Boolean resetCurrentCell, Boolean resetAnchorCell)
at System.Windows.Forms.DataGridView.CommitEditForOpe ration(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.ScrollIntoView(I nt32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
at System.Windows.Forms.DataGridView.ProcessDownKeyIn ternal(Keys keyData, Boolean& moved)
at System.Windows.Forms.DataGridView.ProcessEnterKey( Keys keyData)
at System.Windows.Forms.DataGridView.ProcessDialogKey (Keys keyData)
at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData)
at System.Windows.Forms.TextBoxBase.ProcessDialogKey( Keys keyData)
at System.Windows.Forms.Control.PreProcessMessage(Mes sage& msg)
at System.Windows.Forms.Control.PreProcessControlMess ageInternal(Control target, Message& msg)
at System.Windows.Forms.Application.ThreadContext.Pre TranslateMessage(MSG& msg)




************** Loaded Assemblies **************
mscorlib
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
H.I.S
Assembly Version: 97.1.29.1
Win32 Version: 97.01.29.1
CodeBase: file:///E:/His/Release/H.I.S.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Data
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Core
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Xml
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Configuration
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Transactions
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
System.Runtime.Caching
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Caching/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll
----------------------------------------
System.Numerics
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
System.Data.DataSetExtensions
Assembly Version: 4.0.0.0
Win32 Version: 4.6.1590.0 built by: NETFXREL2
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Data.DataSetExtensions/v4.0_4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll
----------------------------------------
DateTimeSelector
Assembly Version: 1.1.1.0
Win32 Version: 1.1.1.0
CodeBase: file:///E:/His/Release/DateTimeSelector.DLL
----------------------------------------


************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.


For example:


<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>


When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.




تاپیک مشابهی پیدا نکردم و توی یکی از تاپیک ها یه بنده خدایی خارج از پرسش خود تاپیک پرسیده بود و کسی هم جوابش رو نداده بود.
راه حلی به ذهنتون میرسه؟

Mahmoud.Afrad
چهارشنبه 29 فروردین 1397, 15:48 عصر
کد رویداد H.I.S.form.frmTimingAssign.dgReception_CellEndEdit را قرار بدید.

احتمالا مقدار سلول را به نوع دیگر تبدیل میکنید در صورتی که سلول مقدار ندارد.

shaho.khedri
چهارشنبه 29 فروردین 1397, 16:01 عصر
کد رویداد H.I.S.form.frmTimingAssign.dgReception_CellEndEdit را قرار بدید.

احتمالا مقدار سلول را به نوع دیگر تبدیل میکنید در صورتی که سلول مقدار ندارد.


کد اون متد این هستش:
private void dgReception_CellEndEdit(object sender, DataGridViewCellEventArgs e) {


if ((dgReception.Columns[e.ColumnIndex].Name != TimeNameRecCB.Name && dgReception.Columns[e.ColumnIndex].Name != PeopleIdRec.Name) || e.RowIndex == -1) return;


var gRow = dgReception.Rows[e.RowIndex];
DataGridViewComboBoxCell combo = (DataGridViewComboBoxCell)gRow.Cells["TimeNameRecCB"];
if (!ValidateShift(ref combo)) return;


if (gRow.Cells[PeopleIdRec.Name].Value != null && MyTools.StrToInt32Def(gRow.Cells[PeopleIdRec.Name].Value, 0) != 0)
{
int peopleId = MyTools.StrToInt32Def(gRow.Cells[PeopleIdRec.Name].Value, 0);
var pRows = RepTiming.FdtPeopleList.Select(string.Format("Id_stateRec=1 and Id={0} and RoleId like '%,{1},%'", peopleId, (int)ConstantsVariables.TimingRolesEnums.Reception ));
try
{
if (dtRecepAssign.Rows[dgReception.SelectedCells[0].RowIndex]["Id"].ToString().Trim() != "")
{
if (dgReception.Columns[e.ColumnIndex].Name == TimeNameRecCB.Name)
{
mt.ShowError("امکان تغییر شیفت برای رکوردهای ثبت شده وجود ندارد");
combo.Value = lastComboValue;
}
else
{
mt.ShowError("کاربر گرامی برای تغییر شیفت های ثبت شده از گزینه جابجایی استفاده نمایید");
gRow.Cells[PeopleIdRec.Name].Value = lastPId;
}
return;
}
}
catch { }
if (dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value == null || dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value.ToString() == "-1")
{
mt.ShowError("لطفا ابتدا یک شیفت را انتخاب نمایید");
dgReception.Rows.Remove(dgReception.Rows[dgReception.Rows.Count - 2]);
return;
}
if (pRows.Length == 0)
{
mt.ShowError("کد درج شده معتبر نمی باشد");
gRow.Cells[PeopleIdRec.Name].Value = DBNull.Value;


dgReception.Rows.Remove(dgReception.Rows[dgReception.Rows.Count - 2]);


return;
}
DataTable dtOverride = repTiming.CheckOverrideTime(peopleId, MyTools.StrToInt32Def(combo.Value, 0),
MyTools.StrToInt32Def(MyTools.GetDateWithoutSlash( dateTimeSelector.GetText("")), 0));

if (dtOverride.Rows.Count > 0)
{
var result = MessageBox.Show("شیفت انتخاب شده بافعالیت کاربر به عنوان زیر همپوشانی دارد آیا اضافه شود ؟ " + Environment.NewLine + dtOverride.Rows[0]["Name"], "", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
dgReception.Rows.Remove(dgReception.Rows[dgReception.Rows.Count - 2]);
return;
}
}
dgReception.Rows[e.RowIndex].Cells[PeopleNameRec.Name].Value = pRows[0]["fName"] + " " + pRows[0]["lName"];
dgReception.Rows[e.RowIndex].Cells[TimeIdRec.Name].Value = combo.Value;
}
if (((DataTable)combo.DataSource).Rows.Count == 2)
FillInnerCombo();
}

Mahmoud Zaad
چهارشنبه 29 فروردین 1397, 16:50 عصر
با سلام
همونطور که آقای افراد گفتن مشکل از null بودن یک یا چند تا از سلول ها هست. همه مواردی که در اونها سلول رو به رشته تبدیل کردید یعنی ToString شدن کاندیدا هستن! ولی من فکر می کنم مشکل از خط زیر هست
if (dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value == null || dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value.ToString() == "-1")

چون شرط دوم هم اجرا میشه و اگر مقدار نال باشه امکان تبدیل به رشته نیست و خطا میده. اما در این موارد میشه یه متغیر از نوع object تعریف کرد و مقدار سلول رو داخلش ریخت و اگر نال بود مقدار رو 0 در نظر گرفت و بعد شرط اصلی رو چک کرد (یعنی همین متغیر که مقدار سلول هست رو تبدیل به رشته کرد و ...) یا اینکه شرط نال بودن رو در یک شرط بالاتر بررسی کرده و اگر نال نبود شرط دوم اجرا بشه
if (dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value != null)
if(
dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value.ToString() == "-1")
{
//
}

shaho.khedri
چهارشنبه 05 اردیبهشت 1397, 15:01 عصر
با سلام
همونطور که آقای افراد گفتن مشکل از null بودن یک یا چند تا از سلول ها هست. همه مواردی که در اونها سلول رو به رشته تبدیل کردید یعنی ToString شدن کاندیدا هستن! ولی من فکر می کنم مشکل از خط زیر هست
if (dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value == null || dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value.ToString() == "-1")

چون شرط دوم هم اجرا میشه و اگر مقدار نال باشه امکان تبدیل به رشته نیست و خطا میده. اما در این موارد میشه یه متغیر از نوع object تعریف کرد و مقدار سلول رو داخلش ریخت و اگر نال بود مقدار رو 0 در نظر گرفت و بعد شرط اصلی رو چک کرد (یعنی همین متغیر که مقدار سلول هست رو تبدیل به رشته کرد و ...) یا اینکه شرط نال بودن رو در یک شرط بالاتر بررسی کرده و اگر نال نبود شرط دوم اجرا بشه
if (dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value != null)
if(
dgReception.Rows[e.RowIndex].Cells[TimeNameRecCB.Name].Value.ToString() == "-1")
{
//
}



ممنونم از راهنماییتون
مشکل بنده حل شد
مشکل از این بود که بنده روی سیستم خودم از SqlServer 2014 استفاده میکنم و مشتری روی سیستمش 2005 نصب بود و بعضی از کوئری هام روی SQLServer2005 ظاهرا پشتیبانی نمیشد که مجبور شدم کوئری هام رو بازنویسی کنم
مرسی