2016-03-15 35 views
0

我有問題,以顯示一個GridView中的多個sql命令。也許我不需要兩個sqlcommands來顯示兩個表,但我不知道該怎麼做。 第一個命令是讓所有員工在兩個日期之間休假。 我用它通過ID檢索日期的第二個命令。但我不知道如何將它們綁定到一個GridView以顯示爲附加圖像。先謝謝你。asp.net多個sqlcommands在一個GridView

我能得到什麼現在是
阿爾貝2016年3月16日
阿爾貝2016年3月17日

阿爾貝2016年3月18日
約翰娜2016年3月17日

約翰娜2016-03- 18
埃裏克·2016年3月18日

而不是
阿爾貝2016年3月16日,2016年3月17日,2016年3月18日
喬hanna 2016-03-17,2016-03-18
Eric 2016-03-18
我想我必須在兩個while語句之間循環,也許用一個sqlcommand?
enter image description here

我的代碼是:

using (SqlConnection con = new SqlConnection(connection)) 
{ 
con.Open(); 
SqlCommand cmd = new SqlCommand(" SELECT distinct E.EmployeeId, E.FirstName 
FROM Employee E INNER JOIN Vacation V ON E.EmployeeId = V.EmployeeId " + 
    " WHERE ((V.Dates >= @Start AND V.Dates <= @End)) ", con); 
    cmd.Parameters.AddWithValue("@Start", (Calendar1.SelectedDates[0]).Date.ToShortDateString()); 
cmd.Parameters.AddWithValue("@End", (Calendar1.SelectedDates[Calendar1.SelectedDates.Count - 1]).Date.ToShortDateString()); 
using (SqlDataReader dr = cmd.ExecuteReader()) 
{ 
    while (dr.Read()) 
    { 

Response.Write((dr[1]).ToString() + " "); // Cheack if retrivs Employeename 
// Now By Id I want to get all dates belong to specifik employee 

SqlCommand cmd2 = new SqlCommand(" SELECT V.Dates FROM Vacation V " + 
" WHERE ((V.Dates >= @Start AND V.Dates <= @End)) ", con); 
cmd2.Parameters.AddWithValue("@Start", (Calendar1.SelectedDates[0]).Date.ToShortDateString()); 
cmd2.Parameters.AddWithValue("@End", (Calendar1.SelectedDates[Calendar1.SelectedDates.Count - 1]).Date.ToShortDateString()); 
cmd2.Parameters.AddWithValue("@EmployeeId", Convert.ToInt32(dr[0]));          
using (SqlDataReader dr2 = cmd2.ExecuteReader()) 
{ 
while (dr2.Read()) 
    { 
    //Response.Write(Convert.ToDateTime(dr2[0])); 
    GridView7.DataSource = cmd2.ExecuteReader(); 
GridView7.DataBind(); 
    } 

    } 
     Response.Write("<br/>"); 
} 


    } 
    con.close(); 
} 
GridView7.DataSource = cmd.ExecuteReader(); 
GridView7.DataBind(); 
+0

您是否需要將信息作爲列處理?爲什麼不使用他們在單個nvarchar(max)列中進行假期的所有日期,並在它們之間添加逗號?我這樣說是因爲你試圖達到這個目標的方式會變得一團糟,因爲所有的日期都不匹配僱員,你可以使用一個動態的SQL數據透視表,但這會讓你留下一堆空(或空白)空格。 – thepanch

+0

@thepanch感謝您的回覆但我需要在表格或GridView中顯示結果。那可能嗎?對於動態SQL數據透視表,即使這樣也會留下一堆空(或空白)空格。那可能嗎?再次感謝你。 –

+0

@thepanch:我的代碼工作,如果我使用Response.Write(.....)例如: With Response.Write((dr [1])。ToString()+「」); And Response.Write(Convert.ToDateTime(dr2 [0])); 我可以根據需要進行修改,但我不希望它按原樣寫入頁面。 我想在一個表中顯示它們,GridView或動態SQL數據透視表 –

回答

0

的FOR XML PATH語法允許您查詢組值在一個單一的一個:

SELECT 
    E.EmployeeId, 
    E.FirstName, 
    REPLACE(STUFF((
     SELECT 
      COALESCE('¶' + V.Dates, '') 
     FROM 
      Vacation V 
     WHERE 
      V.EmployeeId = E.EmployeeId AND V.Dates >= @Start AND V.Dates <= @End 
     FOR XML PATH('')), 1, 1, ''), '¶', ', ') AS VacationDates 
FROM 
    Employee E 

您可以通過一些替代', '分離器否則,如果你想。

注意:對於multipe編輯抱歉。我只是不確定你如何連接員工,度假和日期。這段代碼基本上顯示了FOR XML PATH語法的想法。

+0

謝謝你的回覆,我得到錯誤「必須聲明標量變量」@Start「」但我聲明爲cmd2.Parameters.AddWithValue(「 @Start「,(Calendar1.SelectedDates [0])。Date.ToShortDateString()); –

+0

在代碼中插入此查詢時,或者直接在數據庫中測試時,會出現該錯誤? – ConnorsFan

+0

沒問題,但是如果我使用Response.Write(.....),我的代碼正在工作: With Response.Write((dr [1])。ToString()+「」); 和 Response.Write(Convert。ToDateTime(DR2 [0])); 我可以根據需要進行修改,但我不希望它按原樣寫入頁面。 我想在表格,GridView或動態SQL數據透視表中顯示它們 –