【问题标题】:asp.net multiple sqlcommands in one GridViewasp.net 一个 GridView 中的多个 sqlcommands
【发布时间】:2016-03-15 17:29:43
【问题描述】:

我无法在一个 GridView 中显示多个 sql 命令。也许我不需要从两个表中显示两个 sqlcommand,但我不知道该怎么做。 第一个命令是获取在两个日期之间有假期的所有员工。 第二个命令我用它来按 ID 检索日期。但我不知道如何将它们都绑定到一个 GridView 以显示为附加图像。提前谢谢你。

我现在得到的是
阿尔伯特 2016-03-16
阿尔伯特 2016-03-17

阿尔伯特 2016-03-18
约翰娜 2016-03-17

约翰娜 2016-03-18
埃里克 2016-03-18

代替
阿尔伯特 2016-03-16, 2016-03-17, 2016-03-18
约翰娜 2016-03-17, 2016-03-18
埃里克 2016-03-18
我想我必须在两个 While 语句之间循环,也许用一个 sqlcommand?

我的代码是:

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

【问题讨论】:

  • 是否需要将信息作为列处理?为什么不在一个 nvarchar(max) 列中使用他们休假的所有日期,并在它们之间添加一个逗号?我这样说是因为您尝试实现这一目标的方式会很混乱,因为员工之间的所有日期都不匹配,您可以使用动态 SQL 数据透视表,但这会给您留下一堆 null (或空白)空格。
  • @thepanch 感谢您的回复,但我需要在表格或 GridView 中显示结果。那可能吗?可以使用动态 SQL 数据透视表,即使它会留下一堆空(或空白)空格。那有可能吗?再次感谢您。
  • @thepanch :如果我使用 Response.Write(.....),我的代码就可以工作,例如:使用 Response.Write((dr[1]).ToString() + " ") ;和 Response.Write(Convert.ToDateTime(dr2[0]));我可以随心所欲地检索,但我不希望它按原样写在页面上。我想在表格、GridView 或动态 SQL 数据透视表中显示它们

标签: asp.net gridview sqlcommand


【解决方案1】:

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

您可以根据需要将', ' 分隔符替换为其他内容。

注意:对于多重编辑感到抱歉。我只是不确定你如何联系员工、假期和日期。这段代码基本上展示了 FOR XML PATH 语法的思想。

【讨论】:

  • 感谢您的回复,我收到错误“必须声明标量变量“@Start””但我声明为 cmd2.Parameters.AddWithValue("@Start", (Calendar1.SelectedDates[ 0]).Date.ToShortDateString());
  • 在代码中插入此查询或直接在数据库中测试时,您会收到该错误?
  • 没关系,但是如果我使用 Response.Write(.....),我的代码就可以工作,例如:With Response.Write((dr[1]).ToString() + " " );和 Response.Write(Convert.ToDateTime(dr2[0]));我可以随心所欲地检索,但我不希望它按原样写在页面上。我想在表格、GridView 或动态 SQL 数据透视表中显示它们
  • 当我插入我的代码时,他回答我说他坚持我运行了 XML 路径或类似的东西,所以它不会工作他的代码。实际上我的代码是这样的,它正在工作,但正如我所说的之前我想在表格、GridView 或动态 SQL 数据透视表中显示它们。但我想我必须使用同名的sqlcommand。我使用两个 sqlcommand,因为我必须先检索employeeId。如果您研究我的代码..那么我如何使用一个命令而不是两个 sqlcommand 和两个 ExecuteReader()?我认为问题在于我使用了两个命令和 ExecuteReader()。感谢您的宝贵时间
  • 我的回答是只用一个查询就可以做到这一点。我不知道你得到什么错误信息。我通常将查询保存为存储过程并从代码中调用该过程。您可以先在数据库中测试我的查询(为 Start 和 End 提供一些值),然后查看输出是否是您想要的。如果是,那么我们可以看看如何让它在您的代码中工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多