none
怎样让一个GRIDVIEW同事绑定不同SQL语句 RRS feed

  • 问题

  • 因为想要实现一个日查询页面,就是显示每个小时第一条数据
    这是SQL的部分语句
    sqlstr[16] = "select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,0,'" + view + "'),120) + ' 0:00') as datetime) and cast((convert(varchar(10),'" + view + "',120) + ' 0:59') as datetime) order by 日期 ASC";
    sqlstr[17] = "select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,0,'" + view + "'),120) + ' 1:00') as datetime) and cast((convert(varchar(10),'" + view + "',120) + ' 1:59') as datetime) order by 日期 ASC";
    我之前是用FOR循环24个GRIDVIEW来显示每个语句,可这么做实现不了客户的要求。
    我现在想用一个GRIDVIEW,显示这个24个SQL语句,如果当某个小时里没有任何数据的时候,那行就显示本小时之内没有数据,请问各位老师该怎样实现呢?
    2009年4月1日 2:30

答案

  • 你的意思是24条语句中如果里面有一条没有数据,则改条记录显示为空?
    你可以这样做:

    <%@ Page Language="C#" ValidateRequest="false" Debug="true" %>
    
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    
    
    <script runat="server">
    
    
      SqlConnection conn;
      string oldTableName;
      string newTableName;
      string ConnectionString = "Data Source=192.168.3.1;Initial Catalog=NorthWind;Persist Security Info=True;User ID=sa;Password=xxxx";
    
      protected void Button1_Click(object sender, EventArgs e)
      {
        conn = new SqlConnection(ConnectionString);
        conn.Open();
        String sql = @"
        SELECT * FROM Products WHERE ProductID = 1;
        SELECT * FROM Products WHERE ProductID = 10;
        SELECT * FROM Products WHERE ProductID = 100000;
        SELECT * FROM Products WHERE ProductID = 2
        ";
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataAdapter sa = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sa.Fill(ds);
        DataTable d = new DataTable();
        bool isCloned = false;
        foreach (DataTable dt in ds.Tables)
        {
          if (dt.Rows.Count > 0)
          {
            if (isCloned == false)
            {
              d = dt.Clone();
              isCloned = true;
            }
            d.ImportRow(dt.Rows[0]);
          }
          else
          {
            d.Rows.Add(d.NewRow());
          }
        }
        GridView1.DataSource = d.DefaultView;
        GridView1.DataBind();    
        conn.Close();
      }
    
      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          DataRowView dv = (DataRowView)e.Row.DataItem;
          if (DBNull.Value.Equals(dv[0]))
          {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
              e.Row.Cells[i].Text = "没有数据";
            }
          }
        }
      }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" 
        onrowdatabound="GridView1_RowDataBound">
      </asp:GridView>
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
      </form>
    </body>
    </html>
    


    孟宪会
    2009年4月1日 10:11
    版主

全部回复

  • 多种解决方案,利用Ajax的Time控件可以定时执行不同的Sql语句进行绑定。

    2009年4月1日 3:53
  • 我知道这种方法,但是这个用在我现在这个上不行,因为我想要的是在一个GRIDVIEW上显示多条SQL语句,我上午用UNION表联合查询做了,能查,但是如果时间段里无数据的时候却显示不出来,无数据提示

    2009年4月1日 4:13
  • 没有数据的时候使用EmptyTemplate显示内容
    孟宪会
    2009年4月1日 4:56
    版主
  • sqlstr = "select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 8:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 8:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 9:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 9:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 10:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 10:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 11:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 11:59') as datetime)
     UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 12:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 12:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 13:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 13:59') as datetime)
     UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 14:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 14:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 15:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 15:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 16:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 16:59') as datetime)
    UNION select top 1 * from z_" + tableName + " where 日期 between cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 17:00') as datetime) and cast((convert(varchar(10),dateadd(day,-1,'" + view + "'),120) + ' 17:59') as datetime) order by 日期 ASC";
    我是这么些SQL语句的,这样能用EmptyTemplate吗?
    2009年4月1日 5:22
  • 你的24个sql 可以合并在一个datatable 里面  (dataadepter.clearbeforfill  设置为false)

    哪一个小时没有数据   ( dataadepter.file(datatable)==0   )  就 add一行  "本小时没有数据”


    热烈庆祝进入4星活跃用户队伍
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年4月1日 5:24
  • 你好能帮我具体写一下吗?
    2009年4月1日 5:46
  • http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.emptydatatemplate.aspx

    只要没有数据,EmptyDataTemplate就会显示。与sql语句无关
    孟宪会
    2009年4月1日 6:11
    版主
  • <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333"
                           GridLines="None" Height="10px" Width="800px" ShowHeader="True">
                           <RowStyle BackColor="#EFF3FB" HorizontalAlign="Center" />
                           <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White"
                               HorizontalAlign="Center" />
                           <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                           <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                           <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                           <EditRowStyle BackColor="#2461BF" />
                           <AlternatingRowStyle BackColor="White" />
                                   <emptydatarowstyle backcolor="LightBlue" forecolor="Red"/>
                                  <emptydatatemplate>
                                   No Data Found.  
                                 </emptydatatemplate> 
     </asp:GridView>  
    我是这么设置GRID的,但是没有任何反应,对了孟好老师,我怎么把24个sql 可以合并在一个datatable 里面 

    2009年4月1日 6:49
  • 兄弟,能不能帮我弄弄,我真不会呀!
    2009年4月1日 6:53
  • 兄弟,能不能帮我弄弄,我真不会呀!
    2009年4月1日 6:53
  • 完整的例子,数据库采用sql server自带的例子数据库。直接拷贝,修改数据库连接即可执行。
    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
        cn.ConnectionString = "Data Source=192.168.3.1;Initial Catalog=NorthWind;Persist Security Info=True;User ID=sa;Password=xxx";
        cn.Open();
        String sql = @"
                    SELECT * FROM Products Where ProductID=1
                    UNION 
                    SELECT * FROM Products Where ProductID=2
                    UNION 
                    SELECT * FROM Products Where ProductID=3
                    ";
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cn);
        System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
        GridView1.DataSource = dr;
        GridView1.DataBind();
        dr.Close();
    
        String sql2 = @"
                    SELECT * FROM Products Where ProductID=1000
                    UNION 
                    SELECT * FROM Products Where ProductID=2000
                    UNION 
                    SELECT * FROM Products Where ProductID=3000
                    ";
        cmd = new System.Data.SqlClient.SqlCommand(sql2, cn);
        dr = cmd.ExecuteReader();
        GridView2.DataSource = dr;
        GridView2.DataBind();
        
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server">
        <EmptyDataTemplate>
          <h1>没有查询到数据。</h1>
        </EmptyDataTemplate>
      </asp:GridView>
      <asp:GridView ID="GridView2" runat="server">
        <EmptyDataTemplate>
          <h1>没有查询到数据。</h1>
        </EmptyDataTemplate>
      </asp:GridView>
      </form>
    </body>
    </html>
    

    孟宪会
    2009年4月1日 7:42
    版主
  • 孟老师我看明白你这个了!
    但是这么做不能满足我现在的需要,因为在查询完24小数据后,还会有保存,和导出的功能
    所以我现在想弄的是把这个24个SQL语句同时绑定到一个GRIDVIEW1里,一个SQL语句是一行,如果有的行搜索不到数据,就显示无数据
    2009年4月1日 8:43
  • 你的意思是24条语句中如果里面有一条没有数据,则改条记录显示为空?
    你可以这样做:

    <%@ Page Language="C#" ValidateRequest="false" Debug="true" %>
    
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    
    
    <script runat="server">
    
    
      SqlConnection conn;
      string oldTableName;
      string newTableName;
      string ConnectionString = "Data Source=192.168.3.1;Initial Catalog=NorthWind;Persist Security Info=True;User ID=sa;Password=xxxx";
    
      protected void Button1_Click(object sender, EventArgs e)
      {
        conn = new SqlConnection(ConnectionString);
        conn.Open();
        String sql = @"
        SELECT * FROM Products WHERE ProductID = 1;
        SELECT * FROM Products WHERE ProductID = 10;
        SELECT * FROM Products WHERE ProductID = 100000;
        SELECT * FROM Products WHERE ProductID = 2
        ";
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataAdapter sa = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sa.Fill(ds);
        DataTable d = new DataTable();
        bool isCloned = false;
        foreach (DataTable dt in ds.Tables)
        {
          if (dt.Rows.Count > 0)
          {
            if (isCloned == false)
            {
              d = dt.Clone();
              isCloned = true;
            }
            d.ImportRow(dt.Rows[0]);
          }
          else
          {
            d.Rows.Add(d.NewRow());
          }
        }
        GridView1.DataSource = d.DefaultView;
        GridView1.DataBind();    
        conn.Close();
      }
    
      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          DataRowView dv = (DataRowView)e.Row.DataItem;
          if (DBNull.Value.Equals(dv[0]))
          {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
              e.Row.Cells[i].Text = "没有数据";
            }
          }
        }
      }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" 
        onrowdatabound="GridView1_RowDataBound">
      </asp:GridView>
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
      </form>
    </body>
    </html>
    


    孟宪会
    2009年4月1日 10:11
    版主
  • 注意:这里的sql语句只是例子,可以换成top 1 *等可以的。看明白原理就可以自己使用了
    孟宪会
    2009年4月1日 10:12
    版主
  • 如果在SQL的层面,这24个查询返回的字段与类型完全相通,你可以用SQL语句的UNION关键字先把它们联合起来。例如:

    SELECT * FROM Products WHERE ProductID < 100 UNION SELECT * FROM Products WHERE ProductID > 1000
    Microsoft ASP.NET MVP
    2009年4月1日 16:34
    版主