您好我正在尝试学习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; }
}
异常详情:
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:
答案 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中更改了变量的一种数据类型,但没有在模型中进行更改。最好从模型中删除表并重新生成它。