繁体   English   中英

将来自两个sql查询结果行的值合并为c#中的datagrid的值

[英]combining values from two sql query result rows into one for a datagrid in c#

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

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

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

    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,名称和总数。 我要做的就是显示contact_details表中的任意两个电话号码。 我尝试使用数据读取器根据员工ID获取电话号码,但是没有用。

请帮忙....

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

  1. 如前所述,不要使用String.Format或Dynamic SQL ,如果您在SQL Server上,请使用带有参数化SQL Command对象的存储过程
  2. 您正在让客户端(Web应用程序或Windows应用程序)为真正需要大量数据的工作(SQL工作而不是C#工作)做过多的工作
  3. 您根本不需要循环甚至不需要使用数据读取器,因为它只会使您的代码code肿并且不必要
  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

使用枢轴时。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM