> For the complete documentation index, see [llms.txt](https://johch3n611u.gitbook.io/c50108/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201903/untitled-9.md).

# 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 通常&#x20;

一行指定運算&#x20;

與 一行比較運算

```

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 後面一定要接表 所以當後面為變數時會出錯

如果確定是一個表 但變數存的是表的名稱&#x20;

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

{% embed url="<https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-2017>" %}

在 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( ) 函數 錯誤訊息

![](/files/-LaT8oCHiac40tAdxu_P)

![](/files/-LaT8wArgdP992diq9e-)

#### 實務上

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

沒人使用則顯示 帳號已新增完成&#x20;

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

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

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

統一塑模語言

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

mda 模型

![](/files/-LaTAgPMy8j_rMb9Xq2Y)

視覺化的關聯圖：

SQL DDL Script：

SQL Server資料庫圖表：

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

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

![](/files/-LaVn9U3tMT3ySG03-ts)

![](/files/-LaVnCGiV8nFZrvsFfCD)

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

![](/files/-LaVnFX_CLIMb8nKKz9g)

![](/files/-LaVnHSxP3ZLKZLW86MR)

![](/files/-LaVnJ2crRvbxvT1bGxX)

系統分析文件就像題目給的圖&#x20;

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

![](/files/-LaVnNzHpGmmaVXzywK1)

![](/files/-LaVnQl8kZe2qhQHjyb5)

![](/files/-LaVnS9ryX82pFq01GwM)

foreign key 外來鍵

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

![](/files/-LaVncXt6dw_umvBcpr8)

一對多有兩種&#x20;

一對多( 可識別的) pfk&#x20;

一對多 ( 不可被識別 ) fk&#x20;

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

![](/files/-LaVnr3u3zTuH-j_Gk12)

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

## ASP.NET 元件Datalist

第二個資料控制項  Datalist

第一個是 gridview

資料來源通常利用其他控制項來抓取&#x20;

以前都用gridview現在換成 Datalist

還是一樣用sqldatasource連接資料庫&#x20;

然後用datalist顯示資料

Datalist 沒有預設畫面 只有指定了datasourceid&#x20;

Visual studio 幫忙自動產生了itemtemplate畫面&#x20;

(2017版本才有以前的沒有&#x20;

自動產生 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&#x20;

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

eval 可編輯

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

### 甲pchome實做

#### 導入照片

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

RepeatColumns重複列&#x20;

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 ｃｓｓ

然後改變顯示資料型態&#x20;

#### 原價：

```
<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>

```

![](/files/-LaVq_PmSa9lFd0e2Mpn)

#### 優點 ：&#x20;

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

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

Gridview適合用在後台

儲存格的內聚外聚設定 CellSpacing="20"&#x20;

儲存格橫直排RepeatDirection="Horizontal"

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

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

### 其他template

(template 畫布隨便你)&#x20;

headertemplate 頂部&#x20;

footertemplate 底部

separatortemplate item裡面序列出現

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

itemtemplate 只要有ｉｔｅｍ就跟讀資料有關

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

```

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

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 字串 結果還是錯…

下總結&#x20;

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

老師講解&#x20;

不能直接寫ｅ．ｉｔｅｍ因為gridview DataList 都是一個畫面顯示很多個資料 就必須用陣列方式去找索引直 且不是判斷０１而是ｔｒｕｅ ｆｕｌｓｅ

下一次要講更新圖片

### 今日成果

前端

```
<%@ 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;
        }
    }
}


```
