TSQL
--流程控制
Copy --流程控制
--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 通常
一行指定運算
與 一行比較運算
Copy
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 (' ') 判斷資料庫裡的某個物件存不存在
並顯示出來
Copy -----------------------------------
--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 ( 每一行都會執行
Copy --流程控制
--case
--簡單case
select 姓名,
case 性別
when '男' then 'Male'
when '女' then 'Female'
end as 性別
from 學生
搜尋 case ( 搜尋確定 才會執行那個case ( 等同於 c# 中的 switch
Copy --搜尋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
練習 等第判斷
Copy --等第判斷
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 增量值
Copy --流程控制
--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 結束值
Copy -------------------------
--*
--**
--***
--****
--*****
declare @i int =1, @star varchar(max) =''
while @i<=500
begin
set @star+='*'
print @star
set @i+=1
end
Copy @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 將前段結果受影響筆數存入
Copy --系統函數
select * from 學生
select @@ROWCOUNT as 受影響列數
例外處理
只要認為 某段程式 可能會在某些程式下會有例外發生就要寫例外處理 否則使用者會直接看到錯誤碼
Copy --例外處理
declare @i int =0
begin try
select 100/@i
end try
begin catch
select '除數為0'
end catch
go
錯誤訊息裡面會透露出系統內部結構 會被駭客下指令變更資料
原本執行 X 如果沒例外 就執行 TRY 如果有例外
Copy 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 中文為模板 : 意思就是沒有任何的預設功能所有功能都必須自己寫
Copy <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實做
導入照片
Copy <asp:Label ID="Product_ImgLabel" runat="server" Text='<%# Eval("Product_Img") %>' />
<img src='ProductsImg/s<%# Eval("Product_Img") %>' />
RepeatColumns重複列
GridLines網格線
Copy <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1"
RepeatColumns="3" GridLines="Both">
所以來設定頁面style 首先設定 div 與 id 並且編輯 style
利用div切板再塞入圖片與控制項 再去設置 id 去調整style
Copy <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
然後改變顯示資料型態
原價:
Copy <asp:Label ID="Label1" runat="server"
Text='<%# Eval("Product_Price","{0:C0}") %>' ForeColor="#999999" />
範例:
Copy <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
Copy <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>
要在後端寫判斷按鈕被觸發
Copy 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)
Copy 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
下一次要講更新圖片
今日成果
前端
Copy <%@ 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>
後端
Copy 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;
}
}
}