2017-09-05 18 views
-2

WindowsフォームアプリケーションでWcfサービスを使用しています。私はSQLデータベースからユーザーemu型に基づいてユーザーのログインシステムを作成しようとしています。テキストボックスに値1を入力すると、フルタイム従業員メソッドelse値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に見られる問題は、条件文がまったく同じであることです。オブジェクトのタイプに基づいて分岐できる方法の1つは、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

要素に混乱のある名前があり、「従業員」クラスがデータリーダーに入力されていないようです。

"FullTimeEmployee"は、あなたのクラスの名前と、あなたの列挙型の名前の1つです。だから私はあなたの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; 
    } 

} 
を宣言する方が安全かもしれないあなたの条件

(EmployeeType)reader["EmployeeType"] == EmployeeType.FullTimeEmployee 

を設定しても安全ではありません

+1

間違ったにおいがする。あなたは引数として渡しているのと同じ値を持つint値の列を返すのであって、従業員のレコードやIdではありません。だから、常にあなたが求めているのと同じ価値を返すことを期待してください。 –

+0

あなたの間違いは、Employee IdをGetEmployee関数に渡してから、EmployeeTypeでコンパイルするストアプロシージャでIdを使用することです。あなたのspはSELECT * FROM tblEmployeeのようなものでなければならないWHERE Id = @ EmployeeId –

+0

reader(0)でメソッド名が期待される。ここに ..どのメソッド名が予期している – Rasel

関連する問題