LINQ to SQL出错:指定的强制转换无效

时间:2012-06-15 12:26:41

标签: sql linq

您好我正在尝试学习LINQ,在LINQ to SQL中我遇到以下异常: 这是Manning出版物Linq In Action的示例代码。 怎么了?

        DataContext db = new DataContext("E:\\Mahesh\\TempFolder\\DB\\NORTHWND.MDF");

        var contacts =
            from contact in db.GetTable<Contact>()
            where contact.City == "Paris"
            select contact;

        foreach (Contact aContact in contacts)
            Console.WriteLine("Bonjour " + aContact.Name);
        Console.Read();
    }
}

[Table(Name = "Customers")]
class Contact
{
    [Column(IsPrimaryKey = true)]
    public int CustomerID { get; set; }
    [Column(Name = "ContactName")]
    public string Name { get; set; }
    [Column]
    public string City { get; set; }
}

Error

异常详情:

System.InvalidCastException was unhandled
HResult=-2147467262
Message=Specified cast is not valid.
Source=System.Data
StackTrace:
   at System.Data.SqlClient.SqlBuffer.get_Int32()
   at Read_Contact(ObjectMaterializer`1 )
   at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at LinqDemo.Program.Main(String[] args) in c:\Users\MAHESH\Desktop\TechNode\C#\MyTechDos\LinqDemo\LinqDemo\Program.cs:line 51
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
InnerException: 

4 个答案:

答案 0 :(得分:5)

如果我的内存服务,Northwind中的Customers表没有CustomerID作为int(我认为它的NVARCHAR)。如果手动编写Contact类,而不是让LINQ to SQL生成它,请确保类上的类型与数据库表中的类型匹配

编辑:从这个链接http://msdn.microsoft.com/en-us/library/bb399575(v=vs.90).aspx我倾向于认为CustomerID字段不是INT而是NVARCHAR(或NCHAR)

答案 1 :(得分:1)

当我尝试使用 Linq to Sql 时,我遇到了同样的问题。由于我的存储过程使用临时表(Linq to Sql工具不为临时表创建类)。因此我必须创建自己的自定义类。发生了同样的异常。

  

堆栈跟踪:      在System.Data.SqlClient.SqlBuffer.get_Int32()      在Read_Contact(ObjectMaterializer 1 ) at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader 2.MoveNext()

发生此错误是因为我试图将 small int 数据库类型变量强制转换为 int C#变量。如果其他任何人都这样做,请将官方Microsoft文档here的数据库类型转换为C#类型映射。

注意:如果您有Specified Cast无效问题,请确保您的数据类型正确。

答案 2 :(得分:0)

圣牛......这对我来说是一个杀手。

实际上这对我来说是一个SQL排序规则问题,因为我在LINQ-to-SQL中有一个名为Dataarea的字段,但在我的SQL视图中,这个字段被称为DataArea。区域中的上部A是问题所在。

通常,SQL对字段名称不区分大小写,但如果您的SQL排序规则是DanishNorwegian,那么这确实有效,并且我得到“指定的强制转换无效”。

奇怪的错误。

答案 3 :(得分:0)

实际上,在将表导入模型后,我在DB中更改了变量的一种数据类型,但没有在模型中进行更改。最好从模型中删除表并重新生成它。