2012-05-10 55 views
0

嗨,我正在制定員工評估計劃,並且我需要獲得每個員工每個領域的平均值,以實現此目標員工每次進入新行他/她被評價爲不覆蓋該員工,我有我的代碼和以前的人的評價不是拋出錯誤,但不是平均寫入數據庫在ms access access 2010中使用c獲得多行的平均值#

public void AvOut() 
{ 
    try 
    { 
     string request = tbEmployee.Text; 
     //Opens a connection to the database 
     OleDbConnection conn = new OleDbConnection(ConnString); 
     conn.Open(); 

     OleDbCommand cmd = conn.CreateCommand(); 
     cmd.CommandText = "SELECT [Admin].[OutPuts] FROM [Admin] WHERE EmployeeName ='" + request + "';"; 
     OleDbDataReader reader = cmd.ExecuteReader(); 

     int total = 0; 
     int count = 0; 

     while (reader.Read()) 
     { 
      total += (int)reader["OutPuts"]; 
      count++; 
     } 

     int avg = total/count; 

     OleDbCommand cmds = conn.CreateCommand(); 
     cmds.CommandText = "SELECT MAX(EmployeeID) AS [id_no] FROM [Admin];"; 
     OleDbDataReader dbReader = cmds.ExecuteReader(); 
     dbReader.Read(); 
     int id = Convert.ToInt32(dbReader["id_no"]); 

     OleDbCommand tot = conn.CreateCommand(); 
     tot.CommandText = (@"UPDATE [Admin] SET AVGOutput ='" + avg + "' WHERE EmployeeID = " + id); 
     int affected = tot.ExecuteNonQuery(); 

     conn.Close(); 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show("The exception is " + e.ToString()); 
    } 
} 
+0

你似乎並不有一個良好的數據庫設計。在繼續之前糾正這個問題是一個好主意。例如,您應該至少有兩個表,也可能有三個表:「員工」,「輸出」和可能的「績效」。 Employee表應該包含兩個或多個部分的EmployeeID和一個員工姓名(姓,名等)。 Outputs表應該只包含EmployeeID,而不是名稱。它不應該包含平均值,因爲它將爲每個員工提供多條線。 CONT ... – Fionnuala

+0

.. CONT平均值應該放在性能表中,因此您可以獲得特定日期的平均值。但是,根本不需要此表,因爲您應該能夠從查詢中獲取所需的全部信息。我建議你在做更多工作之前閱讀SQL和查詢。 ['基本MS Jet SQL'](http://msdn.microsoft.com/en-us/library/aa140011%28office.10%29.aspx) - ['中級MS Jet SQL'](http:///msdn.microsoft.com/en-us/library/aa140015%28office.10%29.aspx) - ['高級MS Jet SQL'](http://msdn.microsoft.com/zh-cn/library /aa139977%28office.10%29.aspx) – Fionnuala

回答

1

你也可以嘗試刪除單引號在平均水平左右。所以,你的查詢應該是:

tot.CommandText = (@"UPDATE [Admin] SET AVGOutput =" + avg + " WHERE EmployeeID = " + id); 

也把一個破發點,看看你得到的平均什麼也查身份證