2019/0326/SQLServer_預存程序+函數&Asp.net_Webforms半自動鏈結資料庫與自動化更新
sqlserver 預存程序 - 續
參數型預存程序
重點1. 變數 宣告型態
重點2. from後面只能接表用exec 強制執行
重點3.begin end為一段
create proc table_query
@tableName nvarchar(20)
as
begin
exec('select * from '+@tableName)
end
----------------------
exec table_query '班級'用gridview導出結果
1.用textbox讓使用者輸入表名稱是不好的,改用下拉式選單
2.取得資料庫所有的table ,
select*from information_schema.tables
where table)type='base table
3.dropdownlist 有分 text 與 value
4.就算是dropdownlist改動也算改變參數所以需要 ControlParameter
5.按下去後要變動顯示表單
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="true"
6.sql使用exec 記得要 from 空格 exec('select * from '+@tableName)
兩個以上參數
建立預存程序跟 執行預存程序要搞懂 不然執行錯誤就會造成無窮迴圈
有指定參數名稱 不用按照順序也沒關係 不然就要按照順序
修改預存程序 alter
參數給定預設值
兩個參數 如果有預設值 若只給1個 也不會抱錯 所以感覺預設值要給模糊查詢萬用字元
新增產品會有個問題 ( 要怎麼做?
如果是規則性的 則按照 邏輯 產生新的東西
要先寫一段程式確定是否重複
新的 與 現有的比較 如果不存在 則 ... ( 商業邏輯
可以寫在資料庫端 ( tsql 與 資料庫是最緊密的
為何要兩層方式傳遞,避免後台接收到兩筆資料
第一筆為判斷資料 第二筆為判斷後顯示資料
其實可以在前端或後端,判斷後顯示資料
第28asp.net模擬
實務上 gridview datasource 通常用於顯示資料 管理資料 通常不做檢查 且很耗資源
傳出參數
通常預存程序是傳出結果 , 傳入不同的參數得到不同的結果
如果這時需要將預存程序的值往外傳 ( 傳出參數
設置兩個預存程序參數 一個為輸入 一個為輸出
宣告一個變數在預存程序外 用於接收輸出
output 參數 寫法比較怪 是 等號左丟給右邊
可以預存程序呼叫另外一個預存程序 但是巢狀限制為32個
結構化的程式法 內聚力會高
內建的預存程序 sp開頭的都是
alter 只能改內容 不能改物件名稱
所以有個叫 sp_rename 舊名稱 , 新名稱
sqlserver函數 function
純量值函數(式) 因為是一段公式
資料表函數(式)
沒有參數的函數
自訂函數名稱通常會 +fn在最前面 不成文的習慣
( ) 內為函數參數
特殊的地方是 需要標註回傳值資料型態
通常要傳出一個值不會用預存程序通常會用函數
會抓到最後一筆 上一筆會被覆蓋
看returns 就會自動辨識是哪種函數
在資料庫寫函數主要是因為能夠跟資料庫做緊密結合
呼叫函數
自訂函數必須把型態寫清楚
有參數的函數
tsql 語法通常先寫名稱在寫資料型態
函數裡面只要看到return以下就不會再執行 所以不用寫 else
函數要用在適合他的地方 預存程序也是
資料表值函數
最大差別在於 returns table
呼叫 資料表值函數
進階資料表值函數應用
2008後才能用 offset fetch 所以在那之前的版本只能自己寫函數
死機碼

唯一識別值 流水號 identity
撈出值在放入 資料表變數中 ( 資料表變數必須寫好型態
asp.net qrcode 查詢商品 實例
ado.net 實務上95%使用這個
sqldataadapter
sqldatadatareader
sqldatasourse 可以做的事情很多 但很多時候實務上並不會用到就會變成佔資源
大部分時間都使用 ado.net
以 qrcode 為例
不使用 sqldatasourse 半自動連接資料庫
以上全自動作對照用
沒有自動連資料庫的物件變半自動
首先using 兩個東西
與資料庫連結的物件
在用到 using
組態管理員 ConfigurationManager
取屬性 資料庫位址
才開始使用
sqldataadapter ( 搜尋指令 , 資料庫位址 )
以上並沒有做顯示安排 所以
安排一個資料表變數 做 斷點查詢 做資料庫是否有連成功判斷
將資料鏈結至gridview做顯示
繫節完後要呼叫一次才會真的繫節
利用adapter時機
一次做一些事情的時候使用 (記憶體??
修改dataset裡面資料 並沒有寫回資料庫 而是在佔存記憶體中
所以要確認就必須下斷點去監看是否成功
執行完後監看式記憶體改變

沒有變化的資料庫

刪除
sqlcommandbuilder 自動物件自動比對 如果有新增就真的新增它
成本大但可以減少output&input disk kam
sqlcommandbuilder 物件 自動比對 如果有新增就真的新增它
da.update(ds,products)
常態性 新增修改刪除 很有可能會發生例外 因為sql那邊錯誤 c#=例外
建議丟到try
發生例外放在 catch (exception ex )
response.write("沒有成功,原因"+ex.message);
設斷點完進入偵錯模式後也要顯示出預覽畫面才可使用監看式觀察數據
sqldatadatareader 物件 只能讀東西出來 無法下指令所以要透過
sqlcommand 可以做新增修改刪除
要將連線打開 資料庫位址.open()
要記得把連線關起來 資料庫位址.close () ( 不關起來就會被一直佔住 除非time out
執行這個方法 讀取資料 因為有很多筆所以要執行迴圈顯示 不然只會顯示最後一筆
while 條件下 每次一讀取就顯示一次

相較於adapter依次讀取近來
datareader則是一筆一筆讀近來顯示完就關掉了所以節省記憶體但是會損耗 pisk i/o
終於要來做qrcode 商品實例了
用29 做 產生qr code
按鈕 取得 現在所有產品的 qr code
事件功能寫在 on click 裡面
記得 using
讀取的 connection
讀取的 command
使用 datareader 讀一筆資料產生一筆qrcode 產生
看 p001 -p010 有沒有被讀出來
每一筆qrcode 就產生一個 img 控制像 用於顯示
後端物件與前端物件最大差異就在於
如果前端已經有那個物件 則在後端使用id
如果沒有是後端鑄造的則用鑄造時的名稱
前端
後端
如果是自動更新物件錯誤 1.可能是資料表無pk無法查詢2.資料庫程式開啟資料表造成更新過但沒重新整理看步道
32 product_search_qr_code 掃描器查詢
後端:讓游標一開始就停在框裡面直接使用掃描器
藉由掃描器裡面的程式辨識qrcode產生值按下按鈕進行驗證
前端
後端
rs232 才能寫程式進掃描機 可以掃一為跟二為所以才會貴還可以縮小範圍放大
偵錯功能修理

Last updated
Was this helpful?