combinando i valori di due righe di risultati di query SQL in uno per un datagrid in c #

StackOverflow https://stackoverflow.com/questions/2020839

  •  19-09-2019
  •  | 
  •  

Domanda

Ho una tabella dipendente che contiene informazioni sui dipendenti e un tavolo i recapiti che contiene i numeri di telefono dei dipendenti. i dipendenti hanno più di 2 numeri di telefono.

Ora, per visualizzare le informazioni dei dipendenti, ho un datagrid. quello che voglio fare è mostrare i primi 2 numeri insieme alle informazioni dei dipendenti nel datagrid.

uso il seguente metodo per riempire la griglia

    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();
            }
        }
    }

il metodo di cui sopra mostra l'EmpID, nome, somma dei dipendenti. tutto quello che voglio fare è visualizzare i numeri di telefono 2 dalla tabella contact_details. Ho provato ad utilizzare un lettore di dati per ottenere i numeri di telefono in base al id dipendente, ma non ha funzionato.

Si prega di aiutare ....

È stato utile?

Soluzione

Credo di sapere cosa Reggie vuole fare, ma prima di dare qualsiasi aiuto reggie consente di dare un'occhiata a un paio di cose che si potrebbe desiderare di guardare:

  1. Come accennato Non utilizzare String.Format o SQL dinamico , se siete su SQL Server fare uso di stored procedure con oggetti Command con parametri SQL
  2. Si stanno avendo il cliente (web app o le finestre app) facendo troppo lavoro per qualcosa che è veramente di dati ad alta intensità (lavoro SQL piuttosto che C # di lavoro)
  3. Non è necessario eseguire un ciclo del tutto o anche utilizzare un DataReader in quanto è solo gonfiore e il codice non necessario
  4. Nella clausola finally si chiude la connessione, ma non hai mai impostato la connessione o l'oggetto comando SQL effettivo a null. So C # raccoglie immondizia, ma è un buon punto di pratica per farlo.
  5. SQL Server 2005 e fino porta a noi la parola chiave PIVOT, cercarlo nella BOL

Per quanto riguarda la tua domanda se si utilizza SQL Server 2005 + è possibile utilizzare PIVOT. Dato che lei ha citato non ci può essere di 2 numeri di contatto, assumiamo uno è il lavoro e uno è a casa.

Si potrebbe fare questo:

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

Login è semplicemente il vostro tabella Impiegati e Phone è il vostro tavolo contatti con il numero di telefono. Presumo un id dipendente può essere trovato nella tabella dei contatti (cioè Login.LoginID = Phone.LoginID) o nel tuo caso Employee.EmpID = Contacts.EmpID.

Quindi questo:

alt text http://img513.imageshack.us/img513/6126/onetime .jpg

Con una query standard non usare perno diventa quindi questo ...:

alt text http://img513.imageshack.us/img513/7395/2time .jpg

Quando si utilizza pivot.

Altri suggerimenti

Non si fa riferimento alla tabella contact_details in qualsiasi parte del SQL. È necessario unire le tabelle dipendenti e contact_details per includere i numeri di telefono.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top