2019/0321/TSQL&TDM&ASP.NET_Datalist

TSQL

--流程控制

--流程控制
--if/else

declare @test varchar(15) ='hello0000'

if @test='hello'
	print '成立'
else
begin
	print '抱歉'
	print '不成立'
end

go

tsql 比較運算式是直接用 = 而不是像c# ==

tsql 不是像c#用 ( ) 而是用 指令 begin end

if else 通常

一行指定運算

與 一行比較運算


declare @height int
set @height=135

if @height>=120
	print '買全票'
else if @height >=90
	print '買半票'
else
	print '免票'
	
	go

使用else if 不但比較好寫且 IF 只會被執行一次

如果 X X X 存在的話 要幹嘛幹嘛 ...

null 是特殊值 比較時不能用 =

函數顏色為桃紅色

object id (' ') 判斷資料庫裡的某個物件存不存在

並顯示出來

-----------------------------------
--object_id() 判斷資料庫裡某個物件存不存在
declare @obj_name varchar(30)
set @obj_name='View有名字的教授資料'

if OBJECT_ID(@obj_name) is null
	print '不存在'
else
	exec('select * from '+@obj_name)

from 後面一定要接表 所以當後面為變數時會出錯

如果確定是一個表 但變數存的是表的名稱

則必須要用指令 exec ( ) 可以將 ( ) 內的參數化為字串

在 tsql 中比if else 更常用 c# switch case

case 又有間單 case 與搜尋 case 用法

簡單case ( 每一行都會執行

--流程控制
--case
--簡單case

select 姓名,  
case 性別
	when '男' then 'Male'
	when '女' then 'Female'
end as 性別
from 學生

搜尋 case ( 搜尋確定 才會執行那個case ( 等同於 c# 中的 switch

--搜尋case
declare @gender nvarchar(1), @result nvarchar(6)
set @gender='444男'

set @result=
case
	when @gender='女' then 'Female'
	when @gender='男' then 'Male'
	else '未知'
end

print @result
go

練習 等第判斷

--等第判斷
declare @score int, @result nvarchar(2)
set @score=75

set @result=
case
	when @score>=90 then '優等'
	when @score>=80 then '甲等'
	when @score>=70 then '乙等'
	when @score>=60 then '丙等'
	else '丁等'
end
print @result

比 C# 優點是 能夠執行 比較運算 且有多重路徑選擇

WHILE 迴圈

通常迴圈內的程式會與條件有關係

TSQL累加1不能寫 ++ 必須寫 @i+=1 增量值

--流程控制
--while迴圈
declare @i int =1, @sum int =0

while @i<=100
begin
	set @sum+=@i
	set @i+=1
end
print @sum

set @sum+=@i 起始值

@i<=100 結束值

-------------------------
--*
--**
--***
--****
--*****

declare @i int =1, @star varchar(max) =''

while @i<=500
begin
	set @star+='*'
	print @star
	set @i+=1
end

@star varchar(max) =''

begin
	set @star+='*'
	print @star
	set @i+=1
end

------------------------------------

set @star+='*'

begin
	set @star+='*'
	print @star
	set @i+=1
end

宣告後內容才會有值 必須要給初始值 不然沒辦法直接拿來運算 會算出空值

常見系統函數

長得像變數 但顏色是函數 系統內建函數 EX.@@ROWCOUNT

@@ROWCOUNT 將前段結果受影響筆數存入

--系統函數
select * from 學生
select @@ROWCOUNT as 受影響列數

例外處理

只要認為 某段程式 可能會在某些程式下會有例外發生就要寫例外處理 否則使用者會直接看到錯誤碼

--例外處理
declare @i int =0
begin try 
	select 100/@i
end try
begin catch
	select '除數為0'
end catch

go

錯誤訊息裡面會透露出系統內部結構 會被駭客下指令變更資料

原本執行 X 如果沒例外 就執行 TRY 如果有例外

declare @i int =0
begin try 
	select 100/@i
end try
begin catch
	select @@ROWCOUNT, @@ERROR, ERROR_NUMBER(),ERROR_STATE(), ERROR_MESSAGE()
end catch

select 100/0

go

但也可顯示給開發人員做除蟲

ERROR_STATE( ) 函數 錯誤訊息

實務上

撈帳號 有資料 顯示此帳號已有人使用

沒人使用則顯示 帳號已新增完成

資料庫作業五 TDM(Toad Data Modeler)

請將如下ER-Diragram利用TDM(Toad Data Modeler)資料庫塑模工具軟體,轉換為視覺化的關聯圖,並利用該軟體產生對應的SQL DDL Script,並利用此Script在資料庫上建置資料庫。

圖靈機 : 要做出能寫程式的程式

統一塑模語言

需求 -> 系統分析 -> 設計文件 -> 自動產出coding ( 用以上軟體

mda 模型

視覺化的關聯圖:

SQL DDL Script:

SQL Server資料庫圖表:

輕量 ssml 管理介面(免費) sqlsever 歐洛扣 管理介面要錢 通常買 tode

Er-mode用tode畫 要用國際通用的er-mode

多值屬性 enty 不要加 因為國際ermod上稱為另外一個實體

系統分析文件就像題目給的圖

很清楚的定義(資料型態大小關聯 等等… (系統設計文件)

foreign key 外來鍵

不用畫在ermode上面 身份證字號不用做? 關聯時會自動+

一對多有兩種

一對多( 可識別的) pfk

一對多 ( 不可被識別 ) fk

三元關係 一對多要拉對方向

複合屬性 轉資料表原則 只做 長在上面的屬性 不做樹根

ASP.NET 元件Datalist

第二個資料控制項 Datalist

第一個是 gridview

資料來源通常利用其他控制項來抓取

以前都用gridview現在換成 Datalist

還是一樣用sqldatasource連接資料庫

然後用datalist顯示資料

Datalist 沒有預設畫面 只有指定了datasourceid

Visual studio 幫忙自動產生了itemtemplate畫面

(2017版本才有以前的沒有

自動產生 Key value 的排法顯示

gridview具有預設畫面但改動幅度很小

template 中文為模板 : 意思就是沒有任何的預設功能所有功能都必須自己寫

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MySystemConnectionString1 %>" 
SelectCommand="SELECT * FROM [Products]"></asp:SqlDataSource>

<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
Product_ID:
<asp:Label ID="Product_IDLabel" runat="server" Text='<%# Eval("Product_ID") %>' />
Product_ID:
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Product_ID") %>' />
</ItemTemplate>

</asp:DataList>

itemtemplate

物件模板 : 用在資料讀取並顯示出來

eval 可編輯

Datalist 因為沒有預設顯示所以必須自己編排

甲pchome實做

導入照片

<asp:Label ID="Product_ImgLabel" runat="server" Text='<%# Eval("Product_Img") %>' />
<img src='ProductsImg/s<%# Eval("Product_Img") %>' />

RepeatColumns重複列

GridLines網格線

<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" 
RepeatColumns="3" GridLines="Both">

所以來設定頁面style 首先設定 div 與 id 並且編輯 style

利用div切板再塞入圖片與控制項 再去設置 id 去調整style

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        #container{
            width:1247px;
            margin:auto;
        }
        #left{
            float:left;
        }
        #right{
            width:1063px;
            float:right;
        }
        #bottom {
            clear:both;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div id="container">

            <div id="top">
                <img src="images/top.jpg" />
            </div>
            <div id="left">
                <img src="images/left.jpg" />
            </div>
            <div id="right">

                 <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" RepeatColumns="3" GridLines="Both">
                <ItemTemplate>
                 
                    <img src='ProductsImg/s<%# Eval("Product_Img") %>' />
                    <br />
                    <asp:Label ID="Label2" runat="server" Text='<%# Eval("Product_Name") %>' />
                    <br />
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("Product_Price") %>' />
                </ItemTemplate>

                
            </asp:DataList>

            </div>
            <div id="bottom">
                <img src="images/bottom.jpg" />
            </div>


            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:MySystemConnectionString1 %>" 
                SelectCommand="SELECT * FROM [Products]"></asp:SqlDataSource>

           

          
        </div>
    </form>
</body>
</html>

將template 當成畫布 一樣在裡面塞 div 然後做style

在label 做更多的 style Big 利用控制項裡面的屬性做style而不是直接key css

然後改變顯示資料型態

原價:

<asp:Label ID="Label1" runat="server" 
Text='<%# Eval("Product_Price","{0:C0}") %>' ForeColor="#999999" />

範例:

<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        #container{
            width:1247px;
            margin:auto;
        }
        #left{
            float:left;
        }
        #right{
            width:1063px;
            float:right;
        }
        #bottom {
            clear:both;
        }


        .line_through{
            text-decoration:line-through;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div id="container">

            <div id="top">
                <img src="images/top.jpg" />
            </div>
            <div id="left">
                <img src="images/left.jpg" />
            </div>
            <div id="right">

              <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" RepeatColumns="3">
                <ItemTemplate>
                    <div style="text-align:center">
                        <img src='ProductsImg/s<%# Eval("Product_Img") %>' />
                        <br />
                        <asp:Label ID="Label2" runat="server" Font-Names="微軟正黑體" Font-Bold="true" Font-Size="14pt" Text='<%# Eval("Product_Name") %>' />
                        <br />
                        原價:
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Product_Price","{0:C0}") %>' ForeColor="#999999" CssClass="line_through" />
                        <br />
                        特價:
                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("Product_Price2","{0:C0}") %>' ForeColor="#ff0066" Font-Names="Arial Black" Font-Size="18pt" />
                    </div>
                </ItemTemplate>

                
            </asp:DataList>

            </div>
            <div id="bottom">
                <img src="images/bottom.jpg" />
            </div>


            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:MySystemConnectionString1 %>" 
                SelectCommand="SELECT * FROM [Products]"></asp:SqlDataSource>

           

          
        </div>
    </form>
</body>

優點 :

不用接觸後端就可以成行且可以連結資料庫動態的 資料庫增刪修前面就會改變

所以 datalist適合用在前台 之所以要用template讓你搞設計

Gridview適合用在後台

儲存格的內聚外聚設定 CellSpacing="20"

儲存格橫直排RepeatDirection="Horizontal"

Datalist 最後會被轉譯為html table td tr ….

Itemtemplate 最重要 在裡面讀資料 沒讀資料都看不見

其他template

(template 畫布隨便你)

headertemplate 頂部

footertemplate 底部

separatortemplate item裡面序列出現

alternatingitemtemplate item與 item 基數偶數不同樣式

itemtemplate 只要有item就跟讀資料有關

itemstyle 套用到相關的Itemtemplate以前常用現在不常

selecteditemtemplate 只要被選了的話就會顯示會隱藏原本的

塞按鈕進itemtemplate 點擊後消失 轉為顯示在selecteditemtemplate

<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" 
                RepeatColumns="3" CellSpacing="20" RepeatDirection="Horizontal"
                 OnItemCommand="DataList1_ItemCommand"
                >
     
                  
                  <ItemTemplate>
                    <div style="text-align:center">
                       
                        <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select"> <%# Eval("Product_id") %></asp:LinkButton>
                        <br />

                        <img src='ProductsImg/s<%# Eval("Product_Img") %>' />
                        <br />
                        <asp:Label ID="Label2" runat="server" Font-Names="微軟正黑體" Font-Bold="true" Font-Size="14pt" Text='<%# Eval("Product_Name") %>' />
                        <br />
                        原價:
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Product_Price","{0:C0}") %>' ForeColor="#999999" CssClass="line_through" />
                        <br />
                        特價:
                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("Product_Price2","{0:C0}") %>' ForeColor="#ff0066" Font-Names="Arial Black" Font-Size="18pt" />
                    </div>
                </ItemTemplate>

                <SelectedItemTemplate>
                    <%# Eval("Product_id") %>我被選了
          <%# Eval("Product_Name") %>
                    <br />
                <%#Eval("Product_Intro").ToString().Replace("\n","<br>") %>

                </SelectedItemTemplate>
         
                  
            </asp:DataList>

要在後端寫判斷按鈕被觸發

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if(e.CommandName=="Select")
            {
                DataList1.SelectedIndex = e.Item.ItemIndex;
                DataBind();
            }
        }

id 索引值 = 發生事件的那個物件的索引直 重新做一次資料繫節

Datalist 可以更改刪除 但還是不能新增 在後台不常見,

但提供評台的業者(消費者)(賣家)的後台還是會使用datalist

如何使用datalist做編輯 需要一個編輯扭可以按下去

之後從唯讀變成一個可編輯的表單 固定的commandname=edit

還是需要按扭觸發事件要寫在datalist on屬性

需要將textbox radiobutton list … 根據資料庫裏面資料型態 安排在edititemtemplate裡面已供修改

多行打字框 textbox textmode = multiline

實務上還要加上驗證控制項

編輯框的內容樣式直接在 edititemtemplate 裡面修改

再來要判斷上架下架必須重資料庫抓資料寫入後端做判斷

控制項放在別人控制項中會找不到 所以必須要使用 findcontrol 並寫說抓的值是什麼(是label)

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            string status=((Label)e.Item.FindControl("lblProduct_Status")).Text;
            RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("rblProduct_Status");
            if (status=="1")
            {
                rbl.Items[0].Selected = true;
            }
            else
                rbl.Items[1].Selected = true;
        }

觸發時間點是編輯模式時所以要寫在 編輯模式觸發中 (上面是錯的)

偵錯 下中斷點 可疑的地方註解掉 慢慢試出來 是位址找到空值或是...

找不到錯誤...

轉換控制項來用label轉成textbox來用 改為抓 string 字串 結果還是錯…

下總結

其他功能都還是正常的 就是抓不到 上架下架的判斷值所以變成不能更改

老師講解

不能直接寫e.item因為gridview DataList 都是一個畫面顯示很多個資料 就必須用陣列方式去找索引直 且不是判斷01而是true fulse

下一次要講更新圖片

今日成果

前端

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="27DataList-Edit.aspx.cs" Inherits="ASPnet._27DataList_Edit" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" 
                RepeatColumns="3" CellSpacing="20" RepeatDirection="Horizontal"
                 OnItemCommand="DataList1_ItemCommand" OnEditCommand="DataList1_EditCommand"
                >
     
                  
                  <ItemTemplate>
                    <div style="text-align:center">
                        <asp:Button ID="Button1" runat="server" Text="編輯資料" CommandName="Edit" />
                        <%--<asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select"> <%# Eval("Product_id") %></asp:LinkButton>--%>
                        <br />

                        <img src='ProductsImg/s<%# Eval("Product_Img") %>' />
                        <br />
                        <asp:Label ID="Label2" runat="server" Font-Names="微軟正黑體" Font-Bold="true" Font-Size="14pt" Text='<%# Eval("Product_Name") %>' />
                        <br />
                        原價:
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Product_Price","{0:C0}") %>' ForeColor="#999999" CssClass="line_through" />
                        <br />
                        特價:
                        <asp:Label ID="Label3" runat="server" Text='<%# Eval("Product_Price2","{0:C0}") %>' ForeColor="#ff0066" Font-Names="Arial Black" Font-Size="18pt" />
                    </div>
                </ItemTemplate>

            <EditItemTemplate>
                <asp:Label ID="lblProduct_Status" runat="server" Text='<%# Eval("Product_Status") %>'></asp:Label>
                <asp:TextBox ID="txtProduct_Status" runat="server" Text='<%# Eval("Product_Status") %>'></asp:TextBox>
                    Product_ID:
                    <asp:Label ID="Product_IDLabel" runat="server" Text='<%# Eval("Product_ID") %>' />
                    <br />
                    Product_Name:
                  
                <asp:TextBox ID="txtProduct_Name" runat="server" Text='<%# Eval("Product_Name") %>' Width="200"></asp:TextBox>
                    <br />
                    Product_Img:
                    <asp:Label ID="Product_ImgLabel" runat="server" Text='<%# Eval("Product_Img") %>' />
                    <br />
                    Product_Price:
                 
                <asp:TextBox ID="txtProduct_Price" runat="server" Text='<%# Eval("Product_Price") %>' Width="100"></asp:TextBox>
                    <br />
                    Product_price2:
          
                <asp:TextBox ID="txtProduct_Price2" runat="server" Text='<%# Eval("Product_Price2") %>' Width="100"></asp:TextBox>
                    <br />
                    Product_Intro:
              
                <asp:TextBox ID="txtProduct_Intro" runat="server" TextMode="MultiLine" Text='<%# Eval("Product_Intro") %>' Width="200" Height="100"></asp:TextBox>
                    <br />
                    Product_Status:
              
                <asp:RadioButtonList ID="rblProduct_Status" runat="server" RepeatDirection="Horizontal">
                    <asp:ListItem Text="上架" Value="1"></asp:ListItem>
                    <asp:ListItem Text="下架" Value="0"></asp:ListItem>
                </asp:RadioButtonList>
                    <br />

                


            </EditItemTemplate>
                  
            </asp:DataList>
             <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:MySystemConnectionString1 %>" 
                SelectCommand="SELECT * FROM [Products]"></asp:SqlDataSource>
        </div>
    </form>
</body>
</html>

後端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASPnet
{
    public partial class _27DataList_Edit : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if(e.CommandName=="Edit")
            {
                DataList1.EditItemIndex = e.Item.ItemIndex;
                DataBind();
                int index = e.Item.ItemIndex;
                string status = ((Label)DataList1.Items[index].FindControl("lblProduct_Status")).Text;
                RadioButtonList rbl = (RadioButtonList)DataList1.Items[index].FindControl("rblProduct_Status");
                //string status = ((TextBox)e.Item.FindControl("txtProduct_Status")).Text;
                //TextBox status2 = (TextBox)e.Item.FindControl("txtProduct_Status");
                if (status == "True")
                {
                    rbl.Items[0].Selected = true;
                }
                else
                    rbl.Items[1].Selected = true;

            }
        }

        protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
        {
            ////string status = ((Label)e.Item.FindControl("lblProduct_Status")).Text;
            //RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("rblProduct_Status");
            ////string status = ((TextBox)e.Item.FindControl("txtProduct_Status")).Text;
            //TextBox status2 = (TextBox)e.Item.FindControl("txtProduct_Status");
            ////if (status == "1")
            ////{
            ////    rbl.Items[0].Selected = true;
            ////}
            ////else
            ////    rbl.Items[1].Selected = true;
        }
    }
}

Last updated