C# 获取强制转换异常

C# 获取强制转换异常,c#,asp.net,linq,C#,Asp.net,Linq,我使用的是Linq 2 SQL,在触发按钮单击事件“Specified cast not valid”时收到此错误消息,堆栈跟踪如下。我不熟悉使用linq to sql,并试图摆脱ADO.NET,它正在使用ADO.NET调用存储过程 [InvalidCastException:指定的强制转换无效。] System.Data.SqlClient.SqlBuffer.get_Decimal()+5299638 System.Data.SqlClient.SqlDataReader.GetDecima

我使用的是Linq 2 SQL,在触发按钮单击事件“Specified cast not valid”时收到此错误消息,堆栈跟踪如下。我不熟悉使用linq to sql,并试图摆脱ADO.NET,它正在使用ADO.NET调用存储过程

[InvalidCastException:指定的强制转换无效。] System.Data.SqlClient.SqlBuffer.get_Decimal()+5299638 System.Data.SqlClient.SqlDataReader.GetDecimal(int32i)+68 读取\u GetBreakDownsResult(ObjectMaterialer
1)+3730
System.Data.Linq.SqlClient.ObjectReader
2.MoveNext()+32 System.Collections.Generic.List
1..ctor(IEnumerable
1 collection)+381 System.Linq.Enumerable.ToList(IEnumerable`1源)+58 GuhringWebsite2.ReportingPortal.Default.LoadBreakDowns(对象发送者,事件参数e)在c:\WillieDevonSmith\GuhringWebsite2\Reporting\Reports\Default.aspx.cs:51中 System.Web.UI.WebControls.Button.OnClick(EventArgs e)+9628722 System.Web.UI.WebControl.Button.RaisePostBackEvent(String eventArgument)+103 System.Web.UI.WebControl.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+35 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+1724

下面是使用linq 2 sql调用存储过程的代码,我将传入一个静态值进行测试

    ReportsDataContext reportsdbContext = new ReportsDataContext();

    var query = reportsdbContext.GetBreakDowns("0070917819");
    GridView1.DataSource = query;
    GridView1.DataBind();
在designer.cs类中,它在这里被执行

    [global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetBreakDowns")]
    public ISingleResult<GetBreakDownsResult> GetBreakDowns([global::System.Data.Linq.Mapping.ParameterAttribute(Name="BillToCustomerNo", DbType="NVarChar(20)")] string billToCustomerNo)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), billToCustomerNo);
        return ((ISingleResult<GetBreakDownsResult>)(result.ReturnValue));
    }

提供的信息没有提供任何线索。如果您可以发布手动执行SP的结果数据,可能会有所帮助。您得到的错误是因为在SP返回的数据中,有一个特定列可能包含null,并且它试图分配的属性不可为null。查找列类型Price或任何具有Decimal类型值的内容。我不能100%确定您的特定问题是什么,但作为一般提示,请确保将DB上下文的使用包装在using语句中。这有助于确保您的DB上下文对象将完成,并且您的DB连接将关闭<代码>使用(ReportsDataContext reportsdbContext=new ReportsDataContext()){///代码的其余部分在这里}我认为@vendettamit走上了正确的道路。您的Gridview是自定义Gridview吗?这意味着您正在手动定义列?我打赌其中一个绑定列需要某种类型,而接收另一种类型。确保绑定列中的类型与数据库中的类型匹配,并检查是否为空。
DivName
的类型是什么?(在表格和C#模型中)提供的信息没有提供任何线索信息。如果您可以发布手动执行SP的结果数据,可能会有所帮助。您得到的错误是因为在SP返回的数据中,有一个特定列可能包含null,并且它试图分配的属性不可为null。查找列类型Price或任何具有Decimal类型值的内容。我不能100%确定您的特定问题是什么,但作为一般提示,请确保将DB上下文的使用包装在using语句中。这有助于确保您的DB上下文对象将完成,并且您的DB连接将关闭<代码>使用(ReportsDataContext reportsdbContext=new ReportsDataContext()){///代码的其余部分在这里}我认为@vendettamit走上了正确的道路。您的Gridview是自定义Gridview吗?这意味着您正在手动定义列?我打赌其中一个绑定列需要某种类型,而接收另一种类型。确保绑定列中的类型与数据库中的类型匹配,并检查是否为空。
DivName
的类型是什么?(在表格和C#模型中)
CREATE PROCEDURE [dbo].[GetBreakDowns] 
-- Add the parameters for the stored procedure here
@BillToCustomerNo nvarchar(20)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT DivName,SUM(CASE WHEN BillingDateYY = '2010' THEN totalvalue ELSE 0 END) 
AS '2010',SUM(CASE WHEN BillingDateYY = '2011' THEN totalvalue ELSE 0 END) 
    AS '2011',SUM(CASE WHEN BillingDateYY = '2012' THEN totalvalue ELSE 0 END)
        AS '2012',SUM(CASE WHEN BillingDateYY = '2013' THEN totalvalue ELSE 0 END)
            AS '2013',SUM(CASE WHEN BillingDateYY = '2014' THEN totalvalue ELSE 0 END)   
                AS '2014', sum(totalvalue) FROM  [ReportData].[dbo].[Sales] WHERE BillToCustomerNo in (@BillToCustomerNo) 
                    GROUP BY DivName
UNION 
SELECT 'Total'As 'DivName',SUM(CASE WHEN BillingDateYY = '2010' THEN totalvalue ELSE 0 END) 
    AS '2010',SUM(CASE WHEN BillingDateYY = '2011' THEN totalvalue ELSE 0 END) 
        AS '2011',SUM(CASE WHEN BillingDateYY = '2012' THEN totalvalue ELSE 0 END) 
            AS '2012',SUM(CASE WHEN BillingDateYY = '2013' THEN totalvalue ELSE 0 END)
                AS '2013',SUM(CASE WHEN BillingDateYY = '2014' THEN totalvalue ELSE 0 END)
                    AS '2014',sum(totalvalue) FROM  [ReportData].[dbo].[Sales] WHERE BillToCustomerNo in (@BillToCustomerNo)
END