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

6

你好,我正在尝试学习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: 

contact.City 是什么数据类型?你确定它是 string 吗? - bluevector
@jonnyGold在数据库contact.City中,它是nvarchar类型,属于Northwind数据库的Customers表。 - Mahesha999
@TimSchmelter 一张图片胜过千言万语;p 但是代码已经添加了;p - Mahesha999
现在在添加更多代码时,SF说:您的帖子没有足够的上下文来解释代码部分,请更清楚地解释您的情况。这是什么意思? - Mahesha999
查看详情!查看详情!明确告诉我们内部异常是什么。 - Totero
@Totero 添加了异常细节 - Mahesha999
4个回答

5
如果我没记错的话,Northwind中的客户表并没有将CustomerID定义为int类型(我认为是NVARCHAR)。如果您手动编写了联系人类(而不是使用LINQ to SQL生成它),请确保您类中的类型与数据库表中的类型相匹配。
编辑:从这个链接http://msdn.microsoft.com/en-us/library/bb399575(v=vs.90).aspx,我倾向于认为CustomerID字段不是INT类型,而是NVARCHAR(或NCHAR)。

2
当我尝试使用Linq to Sql时,我遇到了同样的问题。由于我的存储过程使用了临时表(Linq to Sql工具不会为临时表创建类),因此我不得不创建自己的自定义类。同样的异常发生了。
堆栈跟踪: 在System.Data.SqlClient.SqlBuffer.get_Int32()处 在Read_Contact(ObjectMaterializer1 )处 在System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader2.MoveNext()处
这个错误是因为我试图将我的small int数据库类型变量转换为int C#变量。如果其他人也遇到了同样的问题,请参考官方的Microsoft文档here以获取DB类型到C#类型的映射。
注意:如果你有一个指定的强制转换无效的问题,那么请确保你的数据类型是正确的。

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

0

天啊...这对我来说是个致命的问题。

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

通常情况下,SQL对字段名称不区分大小写,但如果您的SQL排序是丹麦挪威语,则会出现问题,并显示“指定的转换无效”。

奇怪的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接