问题描述
这有点奇怪,因为我以前从未在 C# 中见过这个。今天有用户打电话说他无法运行我们在这里谈论的程序。本例中的程序是从 VB6 到 .Net 4.6.1 的端口,并且已经完美运行了一年多。有问题的用户是我们的新同事,因此将一些初始设置添加到数据库中。
他遇到的问题是在下面的例程中:
protected void Initialiseer()
{
//_logCallback("Initialiseer");
// Unieke code voor PC/process bepalen
CPcpid = Environment.MachineName + "_" + Process.GetCurrentProcess().Id;
LogMessage($"Unique identifier: {CPcpid}");
// De persoonlijke gegevens ophalen
var rst = SltlUserRepo.GetUserByPpUser(CUser);
var user = Ep3UserRepo.GetUserByPpUser(CUser);
// Failsafe for testing purposes only,cPrfId is 0 for 'koepelproef'
if (CPrfId != 0 && user.PRF_ID != CPrfId)
{
throw new InvalidOperationException($"Default proefId komt niet overeen met parameter {user.PRF_ID} != {CPrfId}");
}
var mSchijf = $@"\\WURNET.NL\Homes\{Environment.UserName}\";
CStartDir = Nz(user.STARTDIR,"").Replace(@"M:\",mSchijf).Replace(@"m:\",mSchijf);
CUserNaam = Nz(rst.NAAM,"");
CGewCode = Nz(rst.GEW_CODE,"");
CTltCode = Nz(rst.TLT_CODE,"");
CRegCode = Nz(rst.REG_CODE,"");
CJaar = Convert.ToInt16(Nz(rst.JAAR,""));
...
此错误的堆栈跟踪如下:
2021-07-06 13:36:33.2309 Wur.Epros.ImportWaarnemingen.WinApp.Program.Main Error Unhandled Exception:
Error while building type Wur.Epros.Core.Models.ImportWaarnemingenModel. See the inner exception for details
1.) new ImportWaarnemingenModel()
2.) Wur.Epros.Core.Models.ImportWaarnemingenModel
3.) Instance of Wur.Epros.Core.Models.ImportWaarnemingenModel
4.) Container.GetInstance<Wur.Epros.Core.Models.ImportWaarnemingenModel>()
Stacktrace:
at lambda_method(Closure,IBuildSession,IContext )
at StructureMap.Building.Buildplan.Build(IBuildSession session,IContext context)
at StructureMap.BuildSession.BuildNewInSession(Type pluginType,Instance instance)
at StructureMap.Pipeline.NulloTransientCache.Get(Type pluginType,Instance instance,IBuildSession session)
at StructureMap.BuildSession.ResolveFromLifecycle(Type pluginType,Instance instance)
at StructureMap.SessionCache.Getobject(Type pluginType,ILifecycle lifecycle)
at StructureMap.SessionCache.GetDefault(Type pluginType,IPipelineGraph pipelineGraph)
at StructureMap.Container.GetInstance[T]()
at Wur.Epros.ImportWaarnemingen.WinApp.FrmImportWaarnemingen..ctor() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.ImportWaarnemingen.WinApp\FrmImportWaarnemingen.cs:line 25
at Wur.Epros.ImportWaarnemingen.WinApp.Program.Main() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.ImportWaarnemingen.WinApp\Program.cs:line 34
Inner Exception
Input string was not in a correct format.
Stacktrace:
at System.Number.StringToNumber(String str,NumberStyles options,NumberBuffer& number,NumberFormatInfo info,Boolean parseDecimal)
at System.Number.ParseInt32(String s,NumberStyles style,NumberFormatInfo info)
at system.int16.Parse(String s,NumberFormatInfo info)
at System.Convert.ToInt16(String value)
at Wur.Epros.Core.Workers.WorkerBase.Initialiseer() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Workers\WorkerBase.cs:line 178
at Wur.Epros.Core.Models.ImportWaarnemingenModel..ctor() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Models\ImportWaarnemingenModel.cs:line 45
at lambda_method(Closure,IContext )
重点是
在第 178 行的代码中:
CPcpid = Environment.MachineName + "_" + Process.GetCurrentProcess().Id;
在堆栈跟踪中:
at Wur.Epros.Core.Workers.WorkerBase.Initialiseer()
in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Workers\WorkerBase.cs:line 178
从我们看到这一点的第一刻起,我们就不相信所提供的信息。永远不可能是那条线。经过一些调试和生产运行(耗时)后,我们发现下面这行是问题所在:
CJaar = Convert.ToInt16(Nz(rst.JAAR,""));
与 VB6 Nz 例程等效的例程 'Nz' 在 'obj' == null 时返回 'vervanging',情况正是如此。在数据库中,列 JAAR 的值为 NULL。当然空字符串不能解析为int。
public string Nz(object obj,string vervanging)
{
if (obj == null)
{
return vervanging;
}
return obj.ToString();
}
我希望在堆栈跟踪中看到的不是第 178 行,而是第 198 行,这是错误代码的行。它让我们离开了一段时间。谁能解释为什么堆栈跟踪看起来像它的样子?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)