5

こんにちは、LINQ を学習しようとしていますが、LINQ to SQL では次の例外があります。これは、マニングの出版物による 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テーブルにはintとしてCustomerIDがありません(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# 変数にキャストしようとしたために発生しました。他の誰かが同じことを経験した場合は、DB タイプから C# タイプへのマッピングについて、 こちらの公式 Microsoft ドキュメントを参照してください。

注: 指定されたキャストが有効でない問題がある場合は、データ型が正しいことを確認してください。

于 2018-03-25T13:38:13.873 に答える
0

聖なる牛...これは私にとってキラーでした。

実際、これは私にとって SQL 照合問題でした。なぜなら、LINQ-to-SQL に というDataareaフィールドがあったからDataAreaです。Area の大文字の A が問題でした。

通常、SQL はフィールド名の大文字と小文字を区別しませんが、SQL 照合順序が DanishNorwegian の場合、これは機能し、「指定されたキャストが無効です」というメッセージが表示されます。

奇妙なエラー。

于 2014-03-14T10:27:32.707 に答える