toList()System.InvalidCastException未被用户代码处理

时间:2012-03-09 03:49:00

标签: wcf linq-to-sql windows-services .net appdata

我使用LINQ to SQL编写了一个WCF服务(使用以下article at 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();
        }

调试时,返回参数会抛出异常。在VS 2010的Quick Watch中查看cmd.ToList()的值时,会显示异常。

现在最奇怪的事情是:按“重新评估”按钮几次会将异常更改为快速监视中的所需对象列表。事实上,我必须至少按三次“重新评估”。

在我最近更改服务/数据库之后,我使用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 对象的实例(请参阅上面的第一个代码块),我想知道这是否可能导致问题???

此外,我从桌面应用程序中调用了几种类似于wcf服务的方法,但我没有遇到任何此类问题。

请帮忙。如果需要更多细节,请说明..唯一可以想到的是,数据库正在使用中,当服务与数据库建立另一个连接时,它就会失败。并使用Quick Watch&gt;重试几次;重新评估按钮在监视窗口中显示所需的值,而不会引发任何错误。

请帮助解决这个问题。快速回复非常受欢迎。

感谢。

史蒂夫

1 个答案:

答案 0 :(得分:1)

别介意的人。我解决了。

对于任何正在获得无效演员表异常的人,以下是解决方案。 只有当实际的类模型与数据库不同时才会出现错误。

如果您通过手动编码创建了类模型,则必须将表的每个列名与相应的类相匹配。 LINQ to sql遇到错误,因为它无法将数据库类型转换为.Net类型并抛出无效的强制转换异常。

因此,在大多数情况下,无论是在模型类中手动修复错误还是重新生成类都可以解决问题。