combinando i valori di due righe di risultati di query SQL in uno per un datagrid in c #
-
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 ....
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:
- 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
- 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)
- Non è necessario eseguire un ciclo del tutto o anche utilizzare un DataReader in quanto è solo gonfiore e il codice non necessario
- 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.
- 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.