объединение значений из двух строк результата запроса SQL в одну для таблицы данных в c # - PullRequest
0 голосов
/ 07 января 2010

У меня есть таблица сотрудников, которая содержит информацию о сотрудниках, и таблица контактных данных, которая содержит номера телефонов сотрудников. сотрудники имеют более 2 телефонных номеров.

Теперь для отображения информации о сотруднике у меня есть сетка данных. я хочу отобразить первые 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, имя, сумму сотрудников. все, что я хочу сделать, это показать любые 2 телефонных номера из таблицы contact_details. Я попытался с помощью устройства чтения данных получить телефонные номера на основе идентификатора сотрудника, но это не сработало.

пожалуйста, помогите ....

Ответы [ 2 ]

4 голосов
/ 07 января 2010

Я думаю, что знаю, что хочет сделать Реджи, но прежде чем я окажу вам какую-либо помощь, Реджи взглянет на пару вещей, на которые вы, возможно, захотите взглянуть:

  1. Как уже упоминалось не используйте String.Format или Dynamic SQL , если вы используете SQL Server, используйте хранимые процедуры с параметризованными объектами команд SQL
  2. У вас есть клиент (веб-приложение или приложение для 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

Логин - это просто таблица сотрудников, а Телефон - таблица контактов с номером телефона. Я предполагаю, что идентификатор сотрудника можно найти в таблице контактов (то есть Login.LoginID = Phone.LoginID) или в вашем случае Employee.EmpID = Contacts.EmpID.

Так вот:

альтернативный текст http://img513.imageshack.us/img513/6126/onetime.jpg

При стандартном запросе, не использующем pivot, он становится таким ...:

альтернативный текст http://img513.imageshack.us/img513/7395/2time.jpg

При использовании pivot.

0 голосов
/ 07 января 2010

Вы не ссылаетесь на таблицу contact_details нигде в SQL. Вам нужно присоединиться к таблицам Employee и contact_details, чтобы включить номера телефонов.

...