2017-09-05 128 views
-2

我正在使用Windows窗體應用程序中的wcf服務。我正在嘗試從sql數據庫創建基於用戶emu類型的用戶登錄系統。當我將值1輸入到文本框中時,它應該返回全職僱員方法,否則將值2寫入文本框中它應該返回兼職僱員方法,但它不工作期待..消費wcf服務Windows窗體應用程序

這裏是Employee類代碼....

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

這裏是方法獲取Employee方法來訪問emp基於員工類型loyee ...

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


     } 

下面是截圖,當我運行應用程序... Click here to see the application

+0

我如何刪除此問題? – Rasel

+0

爲什麼這個問題被拒絕? – Rasel

回答

1

我在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(); 
} 
+0

在這種情況下,返回Employee的方法不會返回正確類型的僱員。 –

+0

查看已更新的答案 –

0

您的元素中有一個令人困惑的名稱,而「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; 
    } 

} 
+1

它聞到錯誤。您正在返回一個int值的列,其值與您作爲參數傳遞的值相同,而不是員工記錄或其Id。因此,期望總是回報你所要求的相同價值。 –

+0

您的錯誤是您將Employee ID傳遞給函數GetEmployee,然後在只與EmployeeType進行比較的存儲過程中使用Id。您的sp應該是類似於SELECT * FROM tblEmployee WHERE Id = @ EmployeeId –

+0

reader(0)中預期的方法名稱;這裏 ..哪個方法名稱期待 – Rasel