0

我有一个包含员工信息的员工表和一个包含员工电话号码的联系方式表。员工有两个以上的电话号码。

现在,为了显示员工信息,我有一个数据网格。我想要做的是在数据网格中显示前 2 个数字以及员工信息。

我使用以下方法填充数据网格

    public static void SignUpControllerDay(DateTime Date, System.Windows.Forms.DataGridView PassedGrid)
    {
        string sql_SignUp = String.Format(@"SELECT e.Emp_ID as Emp_ID,
                                      e.First_Name+ ' ' +e.Last_Name as Name,
                                      sum(o.Quantity) as Sum
                                      FROM Employee e,OT_hours o,Position p,Signup_Sheet s
                                      WHERE e.Emp_ID=o.Emp_ID
                                      and e.Emp_ID = s.Employee_ID
                                      and s.Day_Shift = 1
                                      and e.Position_ID = p.Position_ID
                                      and p.Position_Name = 'Controller'
                                      and o.Quantity NOT IN(0.3)
                                            and s.Date = '{0}'
                                      and o.Date <= CONVERT(VARCHAR,'{0}',101) AND o.Date > CONVERT(VARCHAR,DATEADD(YYYY,-1,'{0}'),101)
                                      GROUP BY e.Emp_ID,e.First_Name+' '+e.Last_Name,p.Position_Name
                                      ORDER BY Sum", Date);

        SqlConnection sqlConn = null;
        SqlCommand cmd_SignUp;
        SqlDataReader dr_SignUp;
        try
        {
            sqlConn = new SqlConnection(databaseConnectionString);
            sqlConn.Open();
            cmd_SignUp = new SqlCommand(sql_SignUp, sqlConn);
            dr_SignUp = cmd_SignUp.ExecuteReader();

            while (dr_SignUp.Read())
            {
                PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), dr_SignUp["Sum"].ToString());
            }

        }
        catch (Exception e)
        {
            MessageBox.Show("Error found in SignUpControllerDay..." + Environment.NewLine + e.ToString());
        }
        finally
        {
            if (sqlConn != null)
            {
                sqlConn.Close();
            }
        }
    }

上面的方法显示雇员的empid,name,sum。我要做的就是显示contact_details 表中的任意2 个电话号码。我尝试使用数据阅读器根据员工 ID 获取电话号码,但它不起作用。

请帮忙....

4

2 回答 2

4

我想我知道 reggie 想要做什么,但在我给你任何帮助之前,让 reggie 看看你可能想看的几件事:

  1. 如前所述,不要使用 String.Format 或 Dynamic SQL,如果您在 SQL Server 上,请使用带有参数化 SQL Command 对象的存储过程
  2. 您让客户端(Web 应用程序或 Windows 应用程序)为真正的数据密集型工作(SQL 工作而不是 C# 工作)做太多工作
  3. 您根本不需要循环,甚至不需要使用数据读取器,因为它只会使您的代码膨胀并且不必要
  4. 在 finally 子句中,您关闭了连接,但您从未将连接或实际的 sql 命令对象设置为 null。我知道 C# 垃圾收集,但这样做是一个很好的做法。
  5. SQL Server 2005 及更高版本为我们提供了PIVOT关键字,请在BOL中查找

关于您的问题,如果您使用的是 SQL Server 2005+,您可以使用 PIVOT。鉴于您提到可以有 2 个联系电话,让我们假设一个是工作,一个是家。

你可以这样做:

SELECT 
      FullName, 
      [Work], 
      [Home] 
FROM
(SELECT 
       l.FullName, 
       p.PhoneType, 
       p.PhoneNumber 
 FROM 
       Login l 
 INNER JOIN 
       Phone p 
 ON p.LoginID = l.LoginID) ps
PIVOT
(
 MAX(ps.PhoneNumber)
FOR
 ps.PhoneType IN ([Home], [Work])
) AS pvt

登录只是您的员工表,电话是带有电话号码的联系人表。我假设可以在联系人表中找到员工 ID(即 Login.LoginID = Phone.LoginID),或者在您的情况下为 Employee.EmpID=Contacts.EmpID。

所以这:

替代文字 http://img513.imageshack.us/img513/6126/onetime.jpg

使用不使用数据透视的标准查询然后变成这样......:

替代文字 http://img513.imageshack.us/img513/7395/2time.jpg

使用枢轴时。

于 2010-01-07T15:11:16.570 回答
0

您不会在 SQL 中的任何位置引用 contact_details 表。您需要加入 Employee 和 contact_details 表以包含电话号码。

于 2010-01-07T14:13:48.903 回答