2019/0305/SS查詢式end&ASP.NET_Gridview_自訂樣式分頁

效能&反向運算

集合 一筆資料或以上使用 in

in 查詢 一定要指定欄位 exists不用指定欄位但需要指定關聯

select * from 課程 where 課程編號 in 
(select 課程編號 from 班級 where 學號 in 
(select 學號 from 學生 where 姓名='周杰輪'))

子查詢效能較不好最好以 inner join 寫法 先將多表和為一表並關聯最後查詢一次

select 課程.* from 課程 
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪'

反向子查詢 在in前+not即可

select * from 課程 where 課程編號 not in 
(select 課程編號 from 班級 where 學號 in 
(select 學號 from 學生 where 姓名='周杰輪'))

不用子查詢但同樣結果 做差集 或 EXCEPT前+NOT

select 課程.* from 課程
except
select 課程.* from 課程 
inner join 班級 on 課程.課程編號=班級.課程編號
inner join 學生 on 學生.學號=班級.學號
where 學生.姓名='周杰輪

Not 效能較差會盡量避免 < 集合運算 < 直接查詢

ANSI - SQL 用在任何資料庫都可以的

sybase infoint

mysql

sqlserver t-sql

oracle pl sql

Select * from tbname

all 全部都滿足

select * from 員工 where 薪水>=all
(select 薪水 from 員工 where 城市='台北')

some 或 any (t-sql) 只要其中滿足

select * from 員工 where 薪水>=some
(select 薪水 from 員工 where 城市='台北')

select * from 員工 where 薪水>=any
(select 薪水 from 員工 where 城市='台北')

order by 子句 offset x rows

排序後空出x筆後查詢顯示

select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows

fetch next 只顯示

select 身份證字號,姓名,薪水
from 員工
order by 身份證字號
offset 3 rows
fetch next 2 rows only

null與資料轉換

is null 不是 = null

=' ' 空字串

函數ISNULL(欄位,函式)

ex. ISNULL(電話,'尚未填寫')

select * from 員工 where 電話 is null

select 身份證字號,姓名,ISNULL(電話,'尚未填寫'),薪水 from 員工

生日時間型態資料餵尚未填寫字串

資料轉換

CAST (值 AS 資料型態)

select 學號,姓名, isnull(cast(生日 as varchar),'尚未填寫') from 學生

select cast(生日 as varchar) from 學生

select cast(100 as varchar)

CONVERT 萬用轉型

CONVERT ( 資料型態 , 值 , 格式代號 )

select convert(varchar,生日,20)  from 學生
select 學號,姓名, isnull(convert(varchar,生日,20),'尚未填寫') from 學生

CTE查詢

ex.此人同時是員工也是教授

bl遞迴方式查詢

通常會合併表

暫存表 with

with 有名字的教授表
as
(select 教授.*, 員工.姓名
from 員工 inner join 教授
on 員工.身份證字號=教授.身份證字號)

select *
from 班級 
inner join 學生 on 班級.學號=學生.學號
inner join 課程 on 課程.課程編號=班級.課程編號
inner join 有名字的教授表 on 有名字的教授表.教授編號=班級.教授編號

--------

遞迴錨點

類似自身合併查詢

AS內為CTE內容

with 主管2
as
(
select 員工字號,姓名, 1 as 階層 from 主管 where 主管字號 is null
union all
select 主管.員工字號,主管.姓名, 階層+1 from 主管 inner join 主管2 on 主管.主管字號=主管2.員工字號
)
select * from 主管2
order by 階層

執行結束條件為 主管字號 = 員工字號 此人為主管

遞迴

從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好.從前有座山.山裡有座廟.廟裡有老和尚和小和尚.有天小和尚對老和尚說:師父師父說個故事給我聽吧.老和尚說:好. .........(持續下去)

遞迴很困難 通常寫成迴圈後再改成遞迴

ASP.NET web froms GridView 較複雜自訂樣式分頁

GridView 物件 底下的

Gridrow 物件 為GridView 的每一行

pagerrow 物件 為GridView 的最底下控制行

pagertemplate 物件 建立此物件會取代 pagerrow

Button 按鈕控制項

LinkButton 外觀像超連結的按鈕控制項

ImageButton 外觀是圖片的按鈕控制項

asp控制項後端的css的class屬性為CssClass

值為純文字的後端框 可用label控制項 屬性text則可藉由後端操控

asp.net 後端只能抓到前端控制項屬性值,無法抓到標間中央標籤內的值?

PageIndex 現在狀態的頁數

上一頁 下一頁 合併為 切換分頁

物件觸發事件時會傳兩種東西到後端 1. 名稱 2.事件

protected void 功能名稱 ( 資料型態 物件名稱 ,EventArgs e )

<asp:LinkButton ID="lkbPrev" runat="server" CssClass="btn"
 OnClick="PageChange_Click">3</asp:LinkButton>
<asp:LinkButton ID="lkbNext" runat="server" CssClass="btn"
 OnClick="PageChange_Click">4</asp:LinkButton>
   //protected void lkbNext_Click(object sender, EventArgs e)
        //{
        //    GridView1.PageIndex++;
        //}

        //protected void lkbPrev_Click(object sender, EventArgs e)
        //{
        //    if(GridView1.PageIndex>0)
        //        GridView1.PageIndex--;
        //}

上面的寫法內聚力較高

        protected void PageChange_Click(object sender, EventArgs e)
        {
            if (((LinkButton)sender).ID == "lkbPrev")
            {
                if (GridView1.PageIndex > 0)
                    GridView1.PageIndex--;
            }
            else
            {
                GridView1.PageIndex++;
            }
        }

後端抓前端id 如果控制項擺在別人的控制項內則會抓不到id

必須在後端下指令找到它

    protected void GridView1_DataBound(object sender, EventArgs e)
        {
            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            ((Label)GridView1.BottomPagerRow.Cells[0].FindControl("lblInfo")).Text = page;
        }

前端薇 lable 所以 後端要轉型(指定型?

OnDataBoud事件 繫結時

 <asp:GridView ID="GridView1" 
 runat="server" DataSourceID="SqlDataSource1" 
 PageSize="1" AllowPaging="true"
 OnDataBound="GridView1_DataBound"
 >
<PagerTemplate>
<table style="width:100%">
                        <tr>
                            <td>
                               
                                <asp:LinkButton ID="lkbPrev" runat="server" CssClass="btn" OnClick="PageChange_Click">3</asp:LinkButton>
                                <asp:LinkButton ID="lkbNext" runat="server" CssClass="btn" OnClick="PageChange_Click">4</asp:LinkButton>
                                
                                <asp:DropDownList ID="ddlPager" runat="server">
                                  
                                </asp:DropDownList>
                            </td>
                            <td style="text-align:right">
                                <asp:Label ID="lblInfo" runat="server"></asp:Label>  
                            </td>
                        </tr>
</table>
</PagerTemplate>
</asp:GridView>

下拉式選單

頁數 = 1~ gridview.pagecount

每跑一次跑出一個item

   protected void GridView1_DataBound(object sender, EventArgs e)
        {
            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            ((Label)GridView1.BottomPagerRow.Cells[0].FindControl("lblInfo")).Text = page;

            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                ListItem item = new ListItem();
                item.Text = i.ToString();
                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ((DropDownList)GridView1.BottomPagerRow.Cells[0].FindControl("ddlPager")).Items.Add(item);
            }

            
        }

((DropDownList)GridView1.BottomPagerRow.Cells[0].FindControl("ddlPager")) = DropDownList物件

TextBox 鑄造控制項

TextBox tb = new TextBox ( ) ;

建構子

  protected void Page_Load(object sender, EventArgs e)
        {
            //TextBox tb = new TextBox();
            //tb.Text = "abcd";
            //form1.Controls.Add(tb);
        }

優化 鑄造跟找尋ID不用用迴圈重複

protected void GridView1_DataBound(object sender, EventArgs e)
        {
            TableCell tc = GridView1.BottomPagerRow.Cells[0];

            string page = "Page " + (GridView1.PageIndex + 1) + " of " + GridView1.PageCount;
            Label lblInfo = (Label)tc.FindControl("lblInfo");
            lblInfo.Text = page;

            DropDownList ddlPager = (DropDownList)tc.FindControl("ddlPager");

            ListItem item;
            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                item = new ListItem();
                item.Text = i.ToString();
                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ddlPager.Items.Add(item);
            }            
        }

利用下拉式選單直接切換頁面 ( 事件一定發生在DROPDOWNLIST上面 )

事件 SELECTEDINDEXCHANGED

區域變數

  protected void GridView1_DataBound(object sender, EventArgs e)
        {
 DropDownList ddlPager = (DropDownList)tc.FindControl("ddlPager");

            ListItem item;
            for (int i = 1; i <= GridView1.PageCount; i++)
            {
                item = new ListItem(i.ToString());
                //item.Text = i.ToString();

                if(GridView1.PageIndex==i-1)
                    item.Selected = true;
                ddlPager.Items.Add(item);
            }
}

AUTOPOSTBACK = TURE 才會自動F5

ONTEXTCHANGE = 專注點離開時發生

OVERLODING 多載

TEXT 介面上顯示

VALUE 資料庫給KEY

Last updated