0

LINQ to SQL を使用して WCF サービスを作成しました ( codeporject の次の記事を使用)。同じデータベースに対して同じサービスの wcf 関数呼び出しを既に行った後、オブジェクトの .ToList() メソッドを呼び出すと、無効なキャスト例外が発生します。

例外は次のとおりです。

System.InvalidCastException was unhandled by user code
  Message=Specified cast is not valid.
  Source=System.Data
  StackTrace:
       at System.Data.SqlClient.SqlBuffer.get_Int64()
       at System.Data.SqlClient.SqlDataReader.GetInt64(Int32 i)
       at Read_Command(ObjectMaterializer`1 )
       at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       at SystemsManager.ACS.GetCommands(Int64 agentId) in E:\Projects\SystemsManager\AgentControlService\ACS.svc.cs:line 167
       at SyncInvokeGetCommands(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
  InnerException: 

私が問題を抱えている特定の行は ToList() メソッドにあります

 public List<Command> GetCommands(long agentId)
        {
            var cmd = from command in db.Command where (command.AgentId == agentId) select command;
            return cmd.ToList();
        }

デバッグ時に、return ステートメントが例外をスローします。VS 2010 のクイック ウォッチで cmd.ToList() の値を表示すると、例外が表示されます。

最も奇妙なことは、「再評価」ボタンを数回押すと、例外がクイック ウォッチの必要なオブジェクト リストに変更されることです。実際、「再評価」を少なくとも3回押す必要があります。

サービス/データベースへの最新の変更後、svcutil ツールを使用してクライアントを生成しました。

Windows サービスから次のコードを使用してメソッドを呼び出しています。

var agent = client.GetAgentByIpAddress(myIPAddress);
                client.Close();
                if (agent != null)
                {
                    if (agent.AgentId != -1)
                    {
                        client = new ACSClient();
                        var command = client.GetCommands(agent.AgentId);
                        .....

以下は、wcf サービスのインターフェースにおける Command のモデルです。

[DataContract]
    [Table(Name = "Command")]
    public class Command
    {
        [DataMember, Column(IsPrimaryKey = true, Name = "Command_Id", AutoSync = AutoSync.OnInsert, IsDbGenerated = true, DbType = "Bigint NOT null identity")]
        public long CommandId { get; set; }

        [DataMember, Column(Name = "Agent_Id")]
        public long AgentId { get; set; }

        [DataMember, Column(Name = "Name")]
        public string CommandName { get; set; }

        [DataMember, Column(Name = "Paramters")]
        public string CommandParamters { get; set; }

        [DataMember, Column(Name = "Is_Fetched")]
        public bool IsFectched { get; set; }

        [DataMember, Column(Name = "Status")]
        public long Status { get; set; }

        [DataMember, Column(Name = "Response")]
        public string Response { get; set; }

        [DataMember, Column(Name = "Created")]
        public DateTime Created { get; set; }

        [DataMember, Column(Name = "Last_Modified")]
        public DateTime LastModified { get; set; }

        [DataMember, Column(Name = "Is_Enabled")]
        public bool IsEnabled { get; set; }
    }

重要なこと: 私のデータベース ファイルは、WCF サービスの AppData フォルダーにあります。wcf サービス全体でdbオブジェクトのインスタンスを 1 つだけ使用しています (上記の最初のコード ブロックを参照)。

また、デスクトップ アプリケーションからこのまったく同じ wcf サービスの同様のメソッドをいくつか呼び出しましたが、そのような問題に直面したことはありません。

助けてください。詳細が必要な場合は、その旨を記載してください。データベースが使用中であり、サービスによってデータベースへの別の接続が確立されると失敗する可能性があるということだけが考えられます。[クイック ウォッチ] > [再評価] ボタンを使用して数回再試行すると、エラーをスローすることなくウォッチ ウィンドウに必要な値が表示されます。

これについて親切に助けてください。迅速な対応は高く評価されます。

ありがとう。

スティーブ

4

1 に答える 1

1

みんな気にしないでください。私はそれを解決しました。

無効なキャスト例外を取得している他の人のために、ここに解決策があります。このエラーは、実際のクラスモデルがデータベースと異なる場合にのみ発生します。

手作業でコーディングしてクラスモデルを作成した場合は、テーブルの各列名を対応するクラスと一致させる必要があります。LINQ to sqlは、データベースタイプを.Netタイプに変換できず、無効なキャスト例外をスローするとエラーが発生します。

したがって、ほとんどの場合、モデルクラスでエラーを手動で修正するか、クラスを再生成することで問題を解決できます。

于 2012-03-10T02:57:26.437 に答える