簡體   English   中英

消耗WCF服務Windows窗體應用程序

[英]Consuming wcf service Windows Form Application

我在Windows Form Application中使用Wcf Service。 我正在嘗試從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
    }
}

這是我的全職和兼職雇員班級繼承自Employee類...

     public class FullTimeEmployee : Employee
        {
            public int AnnualSalary { get; set; }
        }
      public class PartTimeEmployee : Employee
        {
            public int HourlyPay { get; set; }
            public int HoursWorked { get; set; }
        }

這是根據員工類型獲取員工的方法來訪問員工...

 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";
}

我還要補充一點,這不一定是最佳實踐,但是它可以滿足您的要求。

除此之外,您返回雇員實例的方法永遠不會返回有效類型的雇員。 似乎GetEmployee方法沒有實例化一個雇員實例。 看起來它總是返回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;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM