5

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

4 回答 4

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 就此而言)

于 2012-06-15T14:24:17.090 回答
1

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

StackTrace:在 System.Data.SqlClient.SqlBuffer.get_Int32() 在 Read_Contact(ObjectMaterializer 1 ) at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader2.MoveNext()

发生此错误是因为我试图将我的小型 int DB 类型变量转换为int C# 变量。如果其他人经历相同的情况,请参阅此处的官方 Microsoft 文档以了解 DB 类型到 C# 类型的映射。

注意:如果您遇到 Specified Cast not valid 问题,请确保您的数据类型正确。

于 2018-03-25T13:38:13.873 回答
0

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

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

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

奇怪的错误。

于 2014-03-14T10:27:32.707 回答
0

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

于 2020-05-04T07:49:16.807 回答