从字符串“”到“Integer”类型的转换无效

时间:2009-11-05 20:15:57

标签: linq-to-sql string integer

当我尝试运行以下代码时,我得到从字符串“”转换为类型'Integer'无效。错误。

        Dim maj = (From c In connect.Courses _
                  Where c.COTRequired = CBool("True") _
                  Select c.CourseID, c.CourseName, c.CreditHours).Except _
                  (From en In connect.Enrollments _
                   Join s In connect.Sections On en.SectionID Equals s.SectionID _
                   Join cs In connect.Courses On s.CourseID Equals cs.CourseID _
                   Join st In connect.Students On en.StudentID Equals st.StudentID _
                   Order By cs.CourseName _
                   Where st.StudentID = CInt(SID) _
                   Select cs.CourseID, cs.CourseName, cs.CreditHours)

        Dim maj2 = (From m2 In maj _
                    Select m2.CreditHours).Sum().ToString

以下是错误详情。我知道需要进行某种类型的转换,但我很难确定哪一种转换。

System.InvalidCastException未被用户代码处理   Message =“从字符串转换”“到'Integer'类型无效。”   来源= “将System.Data.Linq”   堆栈跟踪:        在System.Data.Linq.SqlClient.QueryConverter.VisitInvocation(InvocationExpression invoke)        at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)        在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)        在System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)        在System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)        at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)        在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)        在System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)        在System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression谓词)        在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)        在System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)        at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)        在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)        在System.Data.Linq.SqlClient.QueryConverter.VisitSelect(表达式序列,LambdaExpression选择器)        在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)        在System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)        at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)        在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)        at System.Data.Linq.SqlClient.QueryConverter.VisitExcept(Expression source1,Expression source2)        在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)        在System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)        at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)        在System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式节点)        at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query,SqlNodeAnnotations annotations)        at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)        在System.Data.Linq.DataQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1来源)        在System.Data.Linq.Provider.BindingList.Create [T](DataContext context,IEnumerable 1 sequence) at System.Data.Linq.DataQuery 1.GetNewBindingList()        在System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList()        在System.Windows.Forms.ListBindingHelper.GetList(对象列表)        在System.Windows.Forms.ListBindingHelper.GetList(Object dataSource,String dataMember)        在System.Windows.Forms.BindingSource.ResetList()        在System.Windows.Forms.BindingSource.set_DataSource(对象值)        at WindowsApplication1.Form1.ComboBox1_SelectedIndexChanged(Object sender,EventArgs e)在C:\ Users \ Charles.McBeth \ Documents \ School \ ProgramManagement \ Final Project \ Final Project \ Final Project \ Form1.vb:第68行        在System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)        在System.Windows.Forms.ComboBox.set_SelectedIndex(Int32值)        在System.Windows.Forms.ComboBox.RefreshItems()        在System.Windows.Forms.ComboBox.OnDataSourceChanged(EventArgs e)        在System.Windows.Forms.ListControl.SetDataConnection(Object newDataSource,BindingMemberInfo newDisplayMember,Boolean force)        在System.Windows.Forms.ListControl.set_DataSource(对象值)   InnerException:System.FormatException        Message =“输入字符串的格式不正确。”        来源= “Microsoft.VisualBasic程序”        堆栈跟踪:             在Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value,NumberFormatInfo NumberFormat)             在Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)        InnerException:

3 个答案:

答案 0 :(得分:3)

我怀疑是这一点:

st.StudentID = CInt(SID)

什么是SID,是否有可能是空字符串?如果 是空字符串,您希望代码做什么?

答案 1 :(得分:1)

我可以看到唯一显式转换为整数CInt(SID) - SID字段的类型是什么?如果它包含字母数字值,那可能是您的罪魁祸首。

答案 2 :(得分:0)

我发现LINQ to SQL的局限性难以忍受,所以我开发了自己的数据基础层。但是我发现当我需要使用LINQ to SQL时,它有助于提升代码中的所有计算。

在你的情况下,我会尝试:

Dim intSID = CInt(SID)
Dim maj = ...
        Where c.COTRequired = True _
        ...
        Where st.StudentID = intSID _
        ...

请注意,VB.NET的常量为True和False(无引号),它们是实际的布尔值。