Vb.net 无法强制转换类型为';System.Int32';输入';System.String';
在下面的代码中,我在.SingleorDefault()处得到了一个零星的“无法强制转换类型为”System.Int32“的对象,使其类型为”System.String“异常。它工作9/10次,但随机抛出异常。我确保传递的SettingID没有空值,并且SettingID的表中数据始终存在,并且我始终以整数形式传递SettingID 你知道这个代码有什么问题吗 以下是异常信息: System.InvalidCastException:无法将类型为“System.Int32”的对象强制转换为类型为“System.String”。Vb.net 无法强制转换类型为';System.Int32';输入';System.String';,vb.net,linq,linq-to-sql,casting,Vb.net,Linq,Linq To Sql,Casting,在下面的代码中,我在.SingleorDefault()处得到了一个零星的“无法强制转换类型为”System.Int32“的对象,使其类型为”System.String“异常。它工作9/10次,但随机抛出异常。我确保传递的SettingID没有空值,并且SettingID的表中数据始终存在,并且我始终以整数形式传递SettingID 你知道这个代码有什么问题吗 以下是异常信息: System.InvalidCastException:无法将类型为“System.Int32”的对象强制转换为类型为
在System.Data.SqlClient.SqlBuffer.get_String()上 在读取CPT设置时(ObjectMaterializer`1)
位于System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
在System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)中
在System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)中
在CPT.Service.SettingLinqProvider.GetSettingFromDBById(Int32 SettingId)处 代码:
我已经在每一行之后更新了上面的代码,并在适当的位置进行了一些日志记录
Public Function GetSettingFromDBById(ByVal SettingId As Integer) As ReturnObject(Of Model.ISettingBase)
Dim retObj As New ReturnObject(Of Model.ISettingBase)
Dim dbSetting As CPT_Setting
Dim SettingsList As New List(Of CPT_Setting)
Dim errStr As String = " ENTER "
Try
Dim _cptDB As New CPT.Data.CPTLinqRepository.DB(_connString)
Using _cptDB
errStr &= " - Inside Context "
If _cptDB Is Nothing Then
errStr &= " - With Context is Nothing "
_log.Error("Unusual Object - Unable to create connection object - Object is NOTHING", _userId)
End If
If System.DBNull.Value.Equals(_cptDB) Then
errStr &= " - With Context is NULL "
_log.Error("Unusual Object - Unable to create connection object - Object is NULL", _userId)
End If
errStr &= " - Querying With SettingID = " & SettingId.ToString()
Dim dbSettingTemp = (From s In context.CPT_Settings _
Where s.SettingId = settingId _
Select s)
If dbSettingTemp Is Nothing Then
errStr &= " -- Nothing is returned from DB - Object is NOTHING -- "
_log.Error(errStr, _userId)
End If
If System.DBNull.Value.Equals(dbSettingTemp) Then
errStr &= " -- Nothing is returned from DB - Object is NULL -- "
_log.Error(errStr, _userId)
End If
errStr &= " -- Before SingleOrDefault -- "
dbSetting = dbSettingTemp.SingleOrDefault
errStr &= " -- After SingleOrDefault -- "
If dbSetting IsNot Nothing Then
If System.DBNull.Value.Equals(dbSetting) Then
errStr &= " - NULL OBJECT RETURNED - Before Mapping "
_log.Error("Unusual Exception - NULL OBJECT RETURNED " & errStr, _userId)
End If
retObj.ReturnValue = Mapping.Setting.MapDBToModel(dbSetting)
errStr &= " - After Mapping With SettingID=" & dbSetting.SettingId.ToString() & " SettingName=" & dbSetting.SettingName.ToString() & " StartDate=" & dbSetting.StartDate.ToShortDateString() & " EndDate=" & dbSetting.EndDate.ToShortDateString()
Else
errStr &= " - DBSetting Is Nothing "
_log.Error("Unusual Object - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId)
End If
End Using
Catch ex As Exception
retObj.ReturnValue = Nothing
retObj.AddErrorMessage("Error returning the site: " & ex.Message)
_log.Error("Unusual Exception for SettingID=" & SettingId.ToString() & "--" & errStr & "--" & ex.Message, _userId, ex)
End Try
If retObj.ReturnValue Is Nothing Then
retObj.AddErrorMessage("Site Not Found.")
_log.Info("Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId)
End If
Return retObj
End Function
记住:DB拥有下面消息中提到的所有设置ID的所有行。
结果:
场景1:
异常对象-未检索到SettingID=142176的数据ENTER-内部上下文-SettingID=142176的查询--在SingleOrDefault之前----在SingleOrDefault之后--DBSetting为Nothing
异常对象-MRDD解决方案-未检索到SettingID=142176 ENTER的数据-内部上下文-SettingID=142176的查询-在SingleOrDefault之前---在SingleOrDefault之后---DBSetting什么都不是
场景2
SettingID=138145--ENTER-Inside-Context-SettingID=138145的查询--SingleOrDefault之前--SingleOrDefault之后----指定的强制转换无效
异常对象-MRDD解决方案-未检索到SettingID=138145的数据输入-内部上下文-使用SettingID=138145进行查询-在SingleOrDefault之前--SingleOrDefault之后--
场景3
SettingID=164638——在SingleOrDefault--Index超出数组边界之前,ENTER-Inside-Context-Querying With SettingID=164638——出现异常
异常对象-MRDD解决方案-未检索到设置ID=164638的数据输入-内部上下文-使用设置ID=164638进行查询-在SingleOrDefault之前--您应该检查
From s In context.CPT_Settings _
Where s.SettingId = settingId _
Select s
不返回多个对象。也许它永远不应该,但这可能就是问题所在。你必须使用
Convert.ToString()
希望它能解决您的问题。使用single而不是singleordefault
这就是我们最近在工作中解决类似情况的方法。我已经获得了Microsoft的支持,我们已经启用了debugdiag跟踪和分析转储文件,但没有任何进展 经过大量分析,我发现3/4服务器没有最新的框架更新,因此服务器管理员使用.Net framework 4的可靠性更新1更新了机器,似乎解决了问题。未进行任何代码更改。更新已经两周了,在此代码块中没有看到任何异常
我就为了这个浪费了一个月。该死的。有时候,这不是代码 数据库中的SettingID列是什么类型?您的
CPT\U设置类的属性和db表的列之间是否存在类型不匹配?Like:列是文本,对应的属性是int.Nope。DB列和DBML/类属性之间没有不匹配。我确保第二组眼睛的设置是正确的。SettingID是一个INT NOT NULL列。我知道VB.NET不区分大小写,但由于您的参数列为ByVal SettingID as Integer',那么LINQ查询不应该读为:
Where s.SettingID=SettingID `?“CPT_设置”类型也可能包含答案。该类型上是否有一个属性需要为Null而不是Null?在VB.NET中,我一直遇到这个强制转换问题,试图使用LINQ to对象将数据转储到一个不具有可空类型的对象中。或者可能有一个varchar类型返回的空字符串隐式转换为整数属性。SettingID是主键,因此它将只返回一个值。我还尝试了.SingleOrDefault。这个错误似乎又出现了。我也试过了,但没有用
From s In context.CPT_Settings _
Where s.SettingId = settingId _
Select s