C# 使用wcf服务Windows窗体应用程序

C# 使用wcf服务Windows窗体应用程序,c#,wcf,ado.net,C#,Wcf,Ado.net,我正在Windows窗体应用程序中使用Wcf服务。我正在尝试根据sql数据库中的用户emu类型创建用户登录系统。当我在文本框中输入值1时,它应该返回全职员工方法,否则在文本框中返回值2,它应该返回兼职员工方法,但它没有按照预期工作 这是员工类别代码 [KnownType(typeof(FullTimeEmployee))] [KnownType(typeof(PartTimeEmployee))] [DataContract(Namespace = "http://pra

我正在Windows窗体应用程序中使用Wcf服务。我正在尝试根据sql数据库中的用户emu类型创建用户登录系统。当我在文本框中输入值1时,它应该返回全职员工方法,否则在文本框中返回值2,它应该返回兼职员工方法,但它没有按照预期工作

这是员工类别代码

    [KnownType(typeof(FullTimeEmployee))]
    [KnownType(typeof(PartTimeEmployee))]
    [DataContract(Namespace = "http://pragimtech.com/Employee")]
    public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Order = 1)]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [DataMember(Order = 2)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        [DataMember(Order = 3)]
        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        [DataMember(Order = 4)]
        public DateTime DateOfBirth
        {
            get { return _dateOfBirth; }
            set { _dateOfBirth = value; }
        }

        [DataMember(Order = 5)]
        public EmployeeType Type { get; set; }
    }
    [DataContract(Name = "EmployeeType")]
    public enum EmployeeType
    {
        [EnumMember]
        FullTimeEmployee = 1,
        [EnumMember]
        PartTimeEmployee = 2
    }
}
这是我的全职和兼职雇员类继承自雇员类

     public class FullTimeEmployee : Employee
        {
            public int AnnualSalary { get; set; }
        }
      public class PartTimeEmployee : Employee
        {
            public int HourlyPay { get; set; }
            public int HoursWorked { get; set; }
        }
下面是获取Employee方法以根据员工类型访问员工的方法

 public Employee GetEmployee(int Id)
        {
            Employee employee = null;
            string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("spGetEmployee1", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter parameterId = new SqlParameter();
                parameterId.ParameterName = "@EmployeeType";
                parameterId.Value = Id;
                cmd.Parameters.Add(parameterId);
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    if ((EmployeeType)reader["EmployeeType"] == EmployeeType.FullTimeEmployee)
                    {
                        return employee;
                       }                    }
                    else if ((EmployeeType)reader["EmployeeType"] == EmployeeType.PartTimeEmployee)
                    {

                        return employee;
                       }
                }
            }
            return employee;
        }
这是我的Windows窗体应用程序

  private void button1_Click(object sender, EventArgs e)
        {
            MyService.HalifaxServiceClient myservice = new MyService.HalifaxServiceClient("NetTcpBinding_IHalifaxService");
            MyService.Employee employee = myservice.GetEmployee(Convert.ToInt32(txt1.Text));
            MyService.FullTimeEmployee ft = new MyService.FullTimeEmployee();

            if (employee == myservice.GetEmployee(Convert.ToInt32(txt1.Text).CompareTo(employee.Type)))
            {
                FulltimeEmployeeLinkActivites();
            }
            else if (employee == myservice.GetEmployee(Convert.ToInt32(txt1.Text).CompareTo(employee.Type)))
            {

                PartTimeEmployeeActivities();
            }
            else
            {
                label4.Text = "No infomation found";
            }


        }

这是我运行应用程序时的屏幕截图…

我看到if/else的问题是条件语句完全相同。根据对象类型进行分支的一种方法是使用
is
关键字

if (employee is FullTimeEmployee) 
{
    FulltimeEmployeeLinkActivites();
}
else if (employee is PartTimeEmployee)
{
    PartTimeEmployeeActivities();
}
else
{
    label4.Text = "No information found";
}
我还要补充一点,这不一定是最佳实践,但它应该满足您的要求

此外,返回employee实例的方法永远不会返回有效类型的employee。
GetEmployee
方法似乎从未实例化过employee实例。看起来它总是返回null。尝试返回正确类型的实例。您还需要使用所需的数据填充实例

if ((EmployeeType)reader["EmployeeType"] == EmployeeType.FullTimeEmployee)
{
    return new FullTimeEmployee();
}
else if ((EmployeeType)reader["EmployeeType"] == EmployeeType.PartTimeEmployee)
{
    return new PartTimeEmployee();
} 

元素中有一个混乱的命名,数据读取器中似乎没有填充“employee”类

“FullTimeEmployee”是一个类的名称,也是一个枚举的名称。因此,设置您的条件是不安全的

(EmployeeType)reader["EmployeeType"] == EmployeeType.FullTimeEmployee
如果没有spGetEmployee的代码,我无法确定,但是如果它从表中返回具有相同名称的值,那么声明会更安全

while(reader.Read())
{
    employee= new employee();
    employee.Id= reader.GetInt32(0);
    employee.Name= reader.GetString(1);
    ...
    employee.EmployeeType=(EmployeeType)reader.GetInt32(4);

    if(employee.EmployeeType== EmployeeType.FullTimeEmployee)
    {
        //Do extra work for this type of employee
        ...
        return employee;
    }

}

在这种情况下,返回Employee的方法没有返回正确类型的Employee。它闻起来是错误的。返回的int值列的值与作为参数传递的值相同,不是员工记录或其Id。因此expect始终返回与您请求的值相同的值。您的错误是将员工Id传递给函数GetEmployee,然后在仅将其与EmployeeType进行比较的存储过程中使用该Id。您的sp应该类似于从tblEmployee中选择*,其中Id=@EmployeeIdmethod name应该在读卡器(0)中出现;这里..哪个方法名是预期的让我们看看。我如何删除这个问题?为什么这个问题被否决了??