2011-03-31 59 views
3

我已经使用LINQ to SQL引发无效的转换异常。这是我在C#类:LINQ to SQL中的转换无效

[Table(Name = "tbl_request$")] 
public class request 
{ 
    [Column(IsPrimaryKey = true)] 
    public float requestID; 
    [Column] 
    public string moduleCode; 
    [Column] 
    public float park; 
    [Column] 
    public string requestedRoom; 
    [Column] 
    public float week; 
    [Column] 
    public float day; 
    [Column] 
    public float period; 
    [Column] 
    public float status; 
    [Column] 
    public float semester; 
    [Column] 
    public float priority; 
    [Column] 
    public float adhoc; 
    [Column] 
    public float numStudents; 
    [Column] 
    public float collectionID; 
    [Column] 
    public float roomCount; 
} 

数据库表这相当于

requestID float Unchecked 
moduleCode nvarchar(255) Checked 
park float Checked 
requestedRoom nvarchar(255) Checked 
week float Checked 
day float Checked 
period float Checked 
status float Checked 
semester float Checked 
priority float Checked 
adhoc float Checked 
numStudents float Checked 
collectionID float Checked 
roomCount float Checked 

一切看起来好像没什么问题。还有其他建议吗?

Specified cast is not valid. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Specified cast is not valid. 

Source Error: 

Line 12:    var bookingtable = Database.DatabaseContext.GetTable<Database.request>(); 
Line 13:    var dict = new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<Database.request>>(); 
Line 14:    foreach (var request in bookingtable) 
Line 15:    { 
Line 16:     if (dict[(int)request.collectionID] == null) 

堆栈跟踪深入LINQ内部。

+0

你能发布例外吗? – 2011-03-31 12:49:41

+0

@丹尼尔:不幸的是,“无效演员”真的是几乎所有的说法。我将用它编辑 – Puppy 2011-03-31 12:52:03

+0

检入InnerException什么对象被错误地转换。 – 2011-03-31 12:55:08

回答

5

原来,C#想要一个double?而不是float?,即使DB类型是FLOAT

+0

'float?'也应该可以,尽管最好使用'翻倍?'。在你的情况下,你可能只是忘记了? - 部分,这意味着数据库中的字段可以为NULL – skarmats 2011-03-31 13:29:23

+2

顺便说一句,我建议你总是使用可视化设计器来创建你的模型类。它可能看起来笨重,但它可以帮助您避免大量难以跟踪的错误 - 尤其是,如果您转向更高级的主题(如关联)。只需在表格上定义您的外键,并通过简单的拖放操作即可在代码中获得正确的关联。如果您想要将自定义行为添加到设计器类中,只需将这些添加到一个单独的类文件中,并使类为“partial”。搜索关键字Linq-to-Sql,部分类,你会发现指令 – skarmats 2011-03-31 13:34:05

+2

提醒:SQL服务器*中的float可能是一个4字节的存储大小,在这种情况下,ac#float(32位)可能会工作。但是,具有指定数值精度> 24的SQL服务器浮点数将导致8字节的存储大小,除非在c#代码中使用双精度值(64位),否则将会出错。我遇到了同样的问题,它与忘记Nullable指示符无关。 – ptrandem 2011-07-22 16:46:39