面試好幾家
到現在
總算開始步上軌道
也許這條路開始注定坎坷
也因為不想後悔
逼自己去磨練
逼自己沒有退路
既然買了書 就要看
既然買了筆電 就可以隨時寫程式
為了回雲林也可以練習程式
為了充實自己基礎
為的就是不想給自己後悔
更不想讓自己有藉口
生活即使一團糟 很辛苦
咬著牙度過就是了
真正的辛苦就要開始了
一定要度過這關
本錢比別人少 自己就去創造
從此以後一定要更努力
從現在開始 我決定成為 真正的MVP
2012年11月12日 星期一
2012年11月3日 星期六
使用Entity Framework5做資料刪除
一個小心得分享給大家
這兩天用VS2012改寫資料存取程式發現一個問題
2012預設是用Entity Framework 5做為實體模型的Framework。
這下囧了, EF 5不支援筆者目前使用的語法阿......
這兩天用VS2012改寫資料存取程式發現一個問題
2012預設是用Entity Framework 5做為實體模型的Framework。
這下囧了, EF 5不支援筆者目前使用的語法阿......
2012年10月26日 星期五
結訓了 面對社會吧
結訓了,畢業啦,學到了非常大量的知識,也將這堆知識整理成自己與別人都看的懂的網站,總算可以很自信的告訴別人,我會什麼。
講到這三個月,真的很難講完,學到太多東西了,我們不只要會程式,還要會美工,最好還要會設計版型,再加上雲端應用,不為什麼,因為老闆是個變態的生物阿!(蔡老師名言XD,當然老師們也不算XD
也因為如此,我必須說-作一個網站並不容易,一個網站如果沒人看得懂流程或是動線,那就不算成功的網站,並且不要邊作邊改!這樣不僅容易打亂時程,也容易造成不可預期的意外!(改了就出錯 跑一跑自動出錯......
所有事情都是需要規劃才能完美呈現......
另外,資料庫是非常重要的一環,現在之所以還沒法體會到是因為資料量太少了,資料量一多就可以明顯看出來差異。SQL要學好,任何人都會CRUD,但是如何有效存取真的是一門大學問,我也準備朝這行業進行,目標是攻略各家資料庫@@。
資料庫真的很好玩,玩下去就離不開了(?
最後 謝謝老師們的指導。我會繼續努力的!
接下來就是不斷的尋找,那心有靈犀的公司......
講到這三個月,真的很難講完,學到太多東西了,我們不只要會程式,還要會美工,最好還要會設計版型,再加上雲端應用,不為什麼,因為老闆是個變態的生物阿!(蔡老師名言XD,當然老師們也不算XD
也因為如此,我必須說-作一個網站並不容易,一個網站如果沒人看得懂流程或是動線,那就不算成功的網站,並且不要邊作邊改!這樣不僅容易打亂時程,也容易造成不可預期的意外!(改了就出錯 跑一跑自動出錯......
所有事情都是需要規劃才能完美呈現......
另外,資料庫是非常重要的一環,現在之所以還沒法體會到是因為資料量太少了,資料量一多就可以明顯看出來差異。SQL要學好,任何人都會CRUD,但是如何有效存取真的是一門大學問,我也準備朝這行業進行,目標是攻略各家資料庫@@。
資料庫真的很好玩,玩下去就離不開了(?
最後 謝謝老師們的指導。我會繼續努力的!
接下來就是不斷的尋找,那心有靈犀的公司......
2012年10月20日 星期六
以Commandname或CommandArgument參數切換頁面
筆者在做一個網頁時,由於該網頁的按鈕不少(6-8個),每個按鈕都是轉向至指定網址,因此想要透過一些偷吃步來精簡程式碼XD,首先想到的就是使用switch來判斷按鈕傳回的參數.
2012年10月12日 星期五
以ViewState暫存資料
筆者最近在寫網站的購物車結帳流程,寫的時候為了方便消費者了解目前買了哪些產品,以及產品的單價與總金額,由於總金額 = 每個產品的數量 * 每個產品的單價,
筆者在購物清單中加了一個下拉式選單選擇數量,並從GridView中抓產品的單價,不過做的時候發現有個問題:
數量選擇9個時*產品單價200 = 總金額1800元,用來暫存總金額的Label的確是1800元,結帳時拿Label的1800存到資料表中的total,
結帳完畢後卻發現資料表中的total還是數量1*單價200 = 總金額200元!!!
怎麼會這樣呢? 筆者請教老師後才知道,原因是因為下拉式選單更新數量後頁面會重新載入,所以Label中的1800自然而然就歸零了!要先將總金額1800元存到暫存區內再轉送到資料表,而解決方法就是先將資料存到ViewState中,如此一來畫面即使重新整理後總金額並不會被歸零。
ViewState的用法如下:
存資料至State-
ViewState[0] = "123";
讀取ViewState[0]的資料放置 x-
string x = Convert.ToString(ViewState[0]);
當然,ViewState可以存放整數或其他的資料型別,也可以自訂索引的名稱。
如:
int i = 500;
ViewState["total"] = total;
int y = Convert.ToInt32(ViewState["total"].ToString());
or
int y = int.Parse(ViewState["total"].ToString());
但要注意的是,ViewState只會在該頁面中暫存,一旦離開後ViewState就會自動清除了。
筆者在購物清單中加了一個下拉式選單選擇數量,並從GridView中抓產品的單價,不過做的時候發現有個問題:
數量選擇9個時*產品單價200 = 總金額1800元,用來暫存總金額的Label的確是1800元,結帳時拿Label的1800存到資料表中的total,
結帳完畢後卻發現資料表中的total還是數量1*單價200 = 總金額200元!!!
怎麼會這樣呢? 筆者請教老師後才知道,原因是因為下拉式選單更新數量後頁面會重新載入,所以Label中的1800自然而然就歸零了!要先將總金額1800元存到暫存區內再轉送到資料表,而解決方法就是先將資料存到ViewState中,如此一來畫面即使重新整理後總金額並不會被歸零。
ViewState的用法如下:
存資料至State-
ViewState[0] = "123";
讀取ViewState[0]的資料放置 x-
string x = Convert.ToString(ViewState[0]);
當然,ViewState可以存放整數或其他的資料型別,也可以自訂索引的名稱。
如:
int i = 500;
ViewState["total"] = total;
int y = Convert.ToInt32(ViewState["total"].ToString());
or
int y = int.Parse(ViewState["total"].ToString());
但要注意的是,ViewState只會在該頁面中暫存,一旦離開後ViewState就會自動清除了。
2012年10月9日 星期二
使用CommandArgument傳遞多個參數
筆者寫網頁常需要在GridView中加入Button控制項,做為輸入資料的依據。
string booksname = e.CommandArgument.ToString().Split(',')[1].Trim() ;
string booksprice = e.CommandArgument.ToString().Split(',')[2].Trim();
通常觸發Button_Click後需要傳遞GridView中一些資料作為輸入的資料來源,
之前筆者是使用如下面程式碼的方式抓取GridView中的Label或TextBox的文字以便輸入資料:
--為方便比較筆者將Button的屬性一並放上
--aspx檔部分
<asp:Button ID="Button1" runat="server" CommandName="ShopCar" Text="Button" />
--cs檔部分
Label booksid = (Label)DataList1.Items[e.Item.ItemIndex].FindControl("booksidLabel");
Label booksname = (Label)DataList1.Items[e.Item.ItemIndex].FindControl("booksnameLabel");
Label booksprice = (Label)DataList1.Items[e.Item.ItemIndex].FindControl("bookspriceLabel");
這種作法最大的缺點每抓取一筆資料就需要宣告一個Label或TextBox物件
程式無法撰寫的太精簡,因為需要這些屬性。
後來筆者參考這個網址的做法:以CommandArgument傳遞多個參數
將程式碼改為CommandArgument傳遞所需的參數,如此一來不需要知道Label的ID也能傳遞參數。
--aspx檔部分
<asp:Button ID="Button1" runat="server" CommandName="ShopCar" Text="Button"
CommandArgument='<%# Eval("booksid")+","+ Eval("booksname")+","+Eval("booksprice") %>' />
--cs檔部分則改為
string booksid = e.CommandArgument.ToString().Split(',')[0].Trim();string booksname = e.CommandArgument.ToString().Split(',')[1].Trim() ;
string booksprice = e.CommandArgument.ToString().Split(',')[2].Trim();
以這個程式碼為例,筆者要傳遞三個參數,筆者不需要知道三個Label的ID就能直接抓取與booksid booksname booksprice繫結的欄位並將資料傳遞至cs檔中暫存。
對於常常搞混Label ID的筆者而言的確比較方便,也不會因為更動GridView繫結的物件造成資料錯誤。
2012年10月6日 星期六
使用ADO.NET實體模型與Linq to Entities實作購物車結帳流程
string id = Session["membersid"].ToString();
using (bookstoreEntities1 orderins = new bookstoreEntities1())
{
order ins = new order();
ins.membersid = id;
ins.ordertotal = int.Parse(Label3.Text);
ins.addressee = TextBox5.Text;
ins.phone = TextBox4.Text;
ins.address = TextBox3.Text;
ins.situationid = 1;
orderins.AddToorder(ins);
orderins.SaveChanges();
//查詢最新一筆訂單
int orderid = 0;
var o_id = (from p in orderins.order
where p.membersid == id
orderby p.orderdate descending
select p).First();
if (o_id.ToString() != null)
{
orderid = int.Parse(o_id.orderid.ToString());
}
//查shopcar資料準備寫入orderlist
var s_data = (from p in orderins.shopcar
where p.membersid == id
select p).ToList();
//抓shopcar數量與書籍編號 放入q bkid
int q = 0;
int bkid = 0;
if (s_data.Count > 0)
{
for (int i = 0; i < s_data.Count; i++)
{
orderlist listins = new orderlist();
DropDownList quan = (DropDownList)GridView1.Rows[i].Cells[3].FindControl("DropDownList1");
Label booksid = (Label)GridView1.Rows[i].Cells[0].FindControl("Label2");
q = int.Parse(quan.SelectedValue);
bkid = int.Parse(booksid.Text);
listins.orderid = orderid;
listins.booksid = bkid;
listins.quantity = q;
orderins.AddToorderlist(listins);
}
//刪除購物車中該會員資料
var s_del = from p in orderins.shopcar
where p.membersid == id
select p;
foreach (var x in s_del)
{
orderins.DeleteObject(x);
}
orderins.SaveChanges();
}
}
2012年10月5日 星期五
MySQL遠端存取
一般初學者可能以為MySQL是免費軟體
所以 =效能比較差 或是管理介面一定不好用 .....等等
但其實以筆者近兩個月的使用經驗來說
MySQL是一套實用且易學的資料庫系統
使用者僅需具備基本的英文能力即可輕鬆上手
同時MySQL可以執行於大多數的網頁語言
MySQL原廠即提供 PHP .NET JAVA C C++ Python 等網頁語言的橋接元件(Connection Provider)
只要將橋接元件安裝完成後打開Visual Studio將橋接元件加入參考後就能使用如SqlClient語法的Intellsense
近期更提供套裝的安裝程式 安裝資料庫的同時也將橋接元件一併安裝至妳的電腦
因此筆者認為MySQL是一套容易且效能不錯的資料庫軟體
但MySQL由於安全性的考量
在遠端存取資料庫時不可使用預設的root帳號存取資料
也就是說 網頁並非在本地端執行欲使用root進行資料庫連線時
MySQL會拒絕其root帳號的存取動作
因此須以其他帳號與資料庫連線存取資料
註: MySQL也是有普通版(MySQL Community Server) 商業版(MySQL Enterprise Edition) 與 叢集版(MySQL Cluster)的分別
不知道為什麼大家都會認為MySQL就是免錢的軟體 = =
MySQL官方網站:http://www.mysql.com/
MySQL資料庫系統與橋接元件下載: http://www.mysql.com/downloads/
MySQL資料庫管理系統:http://www.mysql.com/downloads/workbench/
MySQL資料庫系統與橋接元件下載: http://www.mysql.com/downloads/
MySQL資料庫管理系統:http://www.mysql.com/downloads/workbench/
2012年10月2日 星期二
使用LINQ to Entities語法須注意轉型問題
筆者這兩天將以前使用ADO.NET寫的SQL語法改為LINQ to Entities語法時發現
不管是查詢或是新增資料時
如果需要文字方塊輸入資料後轉換資料型別
必須事先將轉型後的資料存為int 或 string or... etc.
否則會跳出錯誤......
假設筆者欲作一個查詢語法如下:
var sel = from p in 購書資料庫.購物車資料表
where p.會員ID == memberid.Text && p.書籍ID == int.Parse(booksid.Text)
select p;
則系統會跳出:
"LINQ to Entities 無法辨識方法 'Int32 Parse(System.String)' 方法,而且這個方法無法轉譯成存放區運算式。"
因此需事先將欲輸入的資料轉為對應的資料型別後,再進行查詢。
正確的語法如下:
int bkid = int.Parse(booksid.Text);
var sel = from p in 購書資料庫.購物車資料表
where p.會員ID == memberid.Text && p.書籍ID == bkid
select p;
注:補充一點,如要將資料轉為整數(int)時,可以用int.Parse() 或者是Convert.ToInt32()來實作
2012年10月1日 星期一
以SqlTransaction搭配具名參數實作轉帳流程
一般而言,,簡略的轉帳流程大致可分為幾個部分:
1. 查詢帳戶餘額是否大於要轉帳的金額,如餘額足夠付款則進行下一個動作。
2. 轉出付款者所輸入的金額至收款者帳戶,付款者帳戶餘額 = 原始餘額扣除轉出金額。
3. 轉入付款者所輸入的金額至收款者帳戶,收款者帳戶餘額 = 原始餘額加上轉入金額。
4. 如上述動作皆完成,則通知付款者轉帳成功;
如未成功則不更動收(付)款者帳戶餘額,並通知付款者轉帳失敗。
簡而言之,即是將付款者帳戶餘額扣掉輸入之金額後再將收款者帳戶餘額加上輸入之金額。
而要如何利用SqlTransaction來做出轉帳功能呢?
其實很簡單,照著上述流程走就行了!
只是筆者建議作新增、修改、刪除皆使用具名參數輸入資料,以確保安全。
轉帳流程範例程式碼如下:
1. 查詢帳戶餘額是否大於要轉帳的金額,如餘額足夠付款則進行下一個動作。
2. 轉出付款者所輸入的金額至收款者帳戶,付款者帳戶餘額 = 原始餘額扣除轉出金額。
3. 轉入付款者所輸入的金額至收款者帳戶,收款者帳戶餘額 = 原始餘額加上轉入金額。
4. 如上述動作皆完成,則通知付款者轉帳成功;
如未成功則不更動收(付)款者帳戶餘額,並通知付款者轉帳失敗。
簡而言之,即是將付款者帳戶餘額扣掉輸入之金額後再將收款者帳戶餘額加上輸入之金額。
而要如何利用SqlTransaction來做出轉帳功能呢?
其實很簡單,照著上述流程走就行了!
只是筆者建議作新增、修改、刪除皆使用具名參數輸入資料,以確保安全。
轉帳流程範例程式碼如下:
using.System.Data.SqlClient;//引用SqlClient以進行轉帳
using System.Data;//引用Data以進行餘額查詢
.
.
.
.
//----------------------Button1_Click
//宣告使用的物件
SqlConnection connect = new SqlConnection
("server = localhost; uid = xxxx; pwd = xxxx; database = transaction;");
SqlDataReader dr;
//inquirecmd為查詢餘額,transoutcmd為轉帳出戶金額, transincmd為轉帳入戶金額;
SqlCommand inquirecmd,transoutcmd, transincmd;
//開啟連線
//開啟連線
connect.Open();
//宣告交易物件並開始資料庫交易
SqlTransaction tran = connect.BeginTransaction();
try
{
//執行餘額查詢,並限制付款方帳戶餘額須大於轉出金額才可進行轉帳
inquirecmd = new SqlCommand
("SELECT @payuser FROM account WHERE user = @payuser AND balance >= @money",
connect);
connect);
//定義餘額查詢中具名參數及給值
inquirecmd.Parameters.Add("@payuser", SqlDbType.NVarChar).Value = payuserBox.Text;
inquirecmd.Parameters.Add("@money", SqlDbType.NVarChar).Value = int.Parse(moneyBox.Text);
inquirecmd.ExecuteNonQuery();
//將查詢結果帶入dr
dr = inquirecmd.ExecuteReader();
//假如餘額大於轉出金額則進行轉帳,小於轉出金額則中斷轉帳流程並提醒使用者餘額不足
if (dr.Read())
{
dr.Close();
dr.Close();
//扣除付款方餘額,請注意connect後方加入了tran,表示此指令列為轉帳流程之一
transoutcmd = new SqlCommand
("UPDATE account SET balance = balance - @money WHERE user = @payuser", connect,
tran);
tran);
//增加付款方餘額,請注意connect後方加入了tran,表示此指令列為轉帳流程之一
transincmd = new SqlCommand
("UPDATE account SET balance = balance + @money WHERE user = @getuser", connect,
tran);
tran);
//定義付款方扣款指令中具名參數及給值
transoutcmd.Parameters.Add("@money", SqlDbType.Int).Value = int.Parse(moneyBox.Text);
transoutcmd.Parameters.Add("@payuser", SqlDbType.NVarChar).Value = payuserBox.Text;
//定義收款方指令中具名參數及給值
transincmd.Parameters.Add("@money", SqlDbType.Int).Value = int.Parse(moneyBox.Text);
transincmd.Parameters.Add("@getuser", SqlDbType.NVarChar).Value = getuserBox.Text;
//執行轉帳流程,如轉出與轉入流程皆完成則交易成功
transoutcmd.ExecuteNonQuery();
transincmd.ExecuteNonQuery();
//交易成功,顯式交易成功訊息及交易金額
tran.Commit();
Response.Write("交易成功,交易金額為" + moneyBox.Text);
}
else
{
//查詢結果餘額不足,提醒消費者並且不進行轉帳流程
throw new Exception("餘額不足");
}
}
catch (Exception ex)
{
//交易失敗,將交易資料復原至交易開始時,並通知使用者交易失敗
tran.Rollback();
Response.Write("交易失敗,請確認輸入之帳戶是否正確");
}
connect.Close();
2012年9月28日 星期五
以預存程序做資料庫查詢
筆者曾在以具名參數實做資料庫新增修改刪除 文章中介紹了具名參數,及其應用的方法......
固然使用具名參數可以減低SQL Injection(SQL 隱碼)的風險,但要加強存取資料庫時的安全性,可以改用預存程序存取資料。
雖然微軟官方網站建立預存程序已經說明了如何使用SQL SERVER的預存程序,但SQL SERVER和MySQL的預存程序語法有些微差異,容易造成混淆,因此筆者將兩種資料庫預存程序列出語法作比較。
SQL SERVER版本:
//建立select_books預存程序
CREATE PROCEDURE select_books
//定義傳入的具名參數名稱與資料型別,SQL SERVER以@辨別具名參數
@booksname varchar(50),
//SQL SERVER以AS開始下SQL指令,以GO做結尾不需加分號(;)
//下SQL指令
MySQL版本:
//MySQL預存程序建立在各資料庫內,因此無須宣告將使用的資料庫
//由root登入localhost建立select_books預存程序(MySQl為TCP/IP登入驗證)
//下SQL指令
SELECT booksname, booksprice
FROM books
WHERE booksname = p_booksname AND booksprice = p_booksprice;
END
固然使用具名參數可以減低SQL Injection(SQL 隱碼)的風險,但要加強存取資料庫時的安全性,可以改用預存程序存取資料。
雖然微軟官方網站建立預存程序已經說明了如何使用SQL SERVER的預存程序,但SQL SERVER和MySQL的預存程序語法有些微差異,容易造成混淆,因此筆者將兩種資料庫預存程序列出語法作比較。
SQL SERVER版本:
//指定使用bookstore資料庫
USE bookstore;
USE bookstore;
GO
//建立select_books預存程序
CREATE PROCEDURE select_books
//定義傳入的具名參數名稱與資料型別,SQL SERVER以@辨別具名參數
@booksname varchar(50),
@booksprice int(10)
//SQL SERVER以AS開始下SQL指令,以GO做結尾不需加分號(;)
AS
//下SQL指令
SELECT booksname, booksprice
FROM books
WHERE booksname = @booksname AND booksprice = @booksprice
GOMySQL版本:
//MySQL預存程序建立在各資料庫內,因此無須宣告將使用的資料庫
//由root登入localhost建立select_books預存程序(MySQl為TCP/IP登入驗證)
CREATE DEFINER=`root`@`localhost` PROCEDURE `select_books`
//定義傳入具名參數名稱的具名參數資料型別並用()區隔,
//MySQL具名參數中不可使用@,?等特殊符號,筆者使用相近的字詞作為具名參數名稱
(
p_booksname varchar(50),
//MySQL具名參數中不可使用@,?等特殊符號,筆者使用相近的字詞作為具名參數名稱
(
p_booksname varchar(50),
p_booksprice int(10)
)
//MySQL以BEGIN開始下SQL指令,以END作結尾需加分號(;)
BEGIN
BEGIN
//下SQL指令
SELECT booksname, booksprice
FROM books
WHERE booksname = p_booksname AND booksprice = p_booksprice;
END
從上面兩個範例看得出來,語法其實大同小異,但是差異頗多,在使用上要多加注意,不要用錯
2012年9月26日 星期三
以ADO.NET實體模型搭配EntityDataSource存取資料庫
今天保哥教了我一招 我才知道-原來ADO.NET實體資料模型也可以搭配EntityDataSource在WEBFORM上使用
步驟很簡單:
1. 建立一個ADO.NET實體模型
2.建立一個EntityDataSource
3. 設定EntityDataSource
接下來就能透過EntityDataSource來存取資料庫了!
EntityDataSource使用方式與SqlDataSource大同小異,都是透過設定精靈完成資料存取。
但兩者差異在於,後端資料庫不是搭配SQL SERVER時,透過SqlDataSource來存取資料庫將會產生語法的問題......
原因在於,SQL SERVER執行SQL指令時可以加入中括號而不影響結果,但如果資料庫使用MySQL卻會造成SERVER讀取指令錯誤無法執行。
筆者的資料庫系統就是使用MySQL,使用SqlDataSource存取資料時都需要自行指定SELECT,INSERT,UPDATE,DELETE指令,設定上也較複雜......
所以,筆者都是習慣寫程式碼 : 建立連線字串->建立連線->存取資料->將資料放到相對應表格 。但是這樣在作網站時會浪費很多時間在建立資料連接與存取上......
如果使用EntityDataSources呢?
很簡單,設定精靈設定完之後就能直接存取資料庫了,不用因為資料庫語法上的差異再做其他設定,甚至寫程式碼存取資料。
針對非SQL SERVER的開發環境EntityDataSource的確比較方便易用,但如果開發環境都是微軟自家產品時差別就不囉!(或許有,但筆者不確定)。
注:使用EntityDataSource時須注意,其所使用的SQL指令並非T-SQL,而是Entity SQL,使用上會有些微差異,範例如下:
account表中有四個欄位{id,pwd,mail,address},假設筆者要查詢account中所有欄位的資料-大家應該會用 * 來做查詢,但在Entity SQL中,例1指令將會發生錯誤,例2才可SELECT到資料
1. (X)SELECT * FROM account WHERE id = 'xyz';
2. (O)SELECT id,pwd,mail,address FROM account WHERE id = 'xyz';
Entity SQL不可使用 "*"
微軟產品的電子書指南
今天在找學習資源時,發現MICROSOFT GULF COMMUNITY BLOG提供微軟相關產品的電子書指南,因此放上來與大家分享。
Large collection of Free Microsoft eBooks
雖然指南都是英文,但是並沒有很艱深的單字,因此請放心閱讀。
當然其中也有MVC4的電子書指南,想要好好了解MVC的話可以閱讀電子書,同時也可以從範例中做練習,對學習MVC會有很大幫助。
MVC4電子檔載點如下:Intro to ASP.NET MVC 4 with Visual Studio - Beta
另外,也提供一個MVC自學的網站ASP.NET MVC 自學日誌
Large collection of Free Microsoft eBooks
雖然指南都是英文,但是並沒有很艱深的單字,因此請放心閱讀。
當然其中也有MVC4的電子書指南,想要好好了解MVC的話可以閱讀電子書,同時也可以從範例中做練習,對學習MVC會有很大幫助。
MVC4電子檔載點如下:Intro to ASP.NET MVC 4 with Visual Studio - Beta
另外,也提供一個MVC自學的網站ASP.NET MVC 自學日誌
以具名參數實做資料庫新增修改刪除
在C#中常會使用文字方塊來輸入資料到資料庫,但是這樣將會有SQL Injection(SQL隱碼)的危險。
當然,可以使用字元替換(TextBox1..Text.Replace)的方法,避免無聊人士胡亂輸入字元,
而筆者則是建議使用具名參數來達成相同的效果,如此一來可以避免掉許多的風險。
使用具名參數的流程可以分為五個部分:
1. 新增使用資料庫以及具名參數所需之Namespace(命名空間)
2. 宣告需使用的物件-SqlConnection及SqlCommand並給予初值
3. 開啟資料庫連線,並建立具名參數所使用的參數名稱,資料型別,並指定輸入的TextBox
4. 執行SQL指令
5. 關閉資料連線
以下為範例程式碼:
//1. 新增使用資料庫以及具名參數所需之Namespace(命名空間)
using System.Data.SqlClient;//引用資料庫所需的資料
using System.Data;//引用具名參數所需的資料
.
.
.
.
//-----------------------------------------------------------------
//2. 宣告連線並指定使用的資料庫名稱及登入帳號密碼
SqlConnection connect = new SqlConnection("server = localhost; uid = xxxx; pwd = yyyy; database = test;");
//3.1 開啟資料連線
connect.Open();
//----------------------------------------新增
//此SQL指令為新增table2的資料,資料表內id欄位所輸入的字串從TextBox而來
SqlCommand cmdInsert = new SqlCommand("INSERT INTO table2(id,name,content,date) VALUES (@id,@name,@content,@date)", connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdInsert.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
cmdInsert.Parameters.Add("@name",SqlDbType.NVarChar).Value = TextBox2.Text;
cmdInsert.Parameters.Add("@content",SqlDbType.NVarChar).Value = TextBox3.Text;
cmdInsert.Parameters.Add("@date",SqlDbType.NVarChar).Value = TextBox4.Text;
//4. 開啟資料庫執行SQL語法
cmdInsert.ExecuteNonQuery();
//----------------------------------------修改
//此SQL指令為更新table2的資料,資料表內id欄位所輸入的字串從TextBox而來
SqlCommand cmdUpdate = new SqlCommand("UPDATE table2 SET name = @name, content = @content, date = @date WHERE id = @id",connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdUpdate.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
cmdUpdate.Parameters.Add("@name",SqlDbType.NVarChar).Value = TextBox2.Text;
cmdUpdate.Parameters.Add("@content",SqlDbType.NVarChar).Value = TextBox3.Text;
cmdUpdate.Parameters.Add("@date",SqlDbType.NVarChar).Value = TextBox4.Text;
//4. 開啟資料庫執行SQL語法
cmdUpdate.ExecuteNonQuery();
//---------------------------------------刪除
//此SQL指令為刪除table2的某筆資料,TextBox1.Text輸入的字串為刪除依據
SqlCommand cmdDelete = new SqlCommand("DELETE FROM table2 WHERE id = @id",connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdDelete.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
//4. 開啟資料庫執行SQL語法
cmdDelete.ExecuteNonQuery();
//5. 關閉資料連線
connect.Close();
當然,可以使用字元替換(TextBox1..Text.Replace)的方法,避免無聊人士胡亂輸入字元,
而筆者則是建議使用具名參數來達成相同的效果,如此一來可以避免掉許多的風險。
使用具名參數的流程可以分為五個部分:
1. 新增使用資料庫以及具名參數所需之Namespace(命名空間)
2. 宣告需使用的物件-SqlConnection及SqlCommand並給予初值
3. 開啟資料庫連線,並建立具名參數所使用的參數名稱,資料型別,並指定輸入的TextBox
4. 執行SQL指令
5. 關閉資料連線
以下為範例程式碼:
//1. 新增使用資料庫以及具名參數所需之Namespace(命名空間)
using System.Data.SqlClient;//引用資料庫所需的資料
using System.Data;//引用具名參數所需的資料
.
.
.
.
//-----------------------------------------------------------------
//2. 宣告連線並指定使用的資料庫名稱及登入帳號密碼
SqlConnection connect = new SqlConnection("server = localhost; uid = xxxx; pwd = yyyy; database = test;");
//3.1 開啟資料連線
connect.Open();
//----------------------------------------新增
//此SQL指令為新增table2的資料,資料表內id欄位所輸入的字串從TextBox而來
SqlCommand cmdInsert = new SqlCommand("INSERT INTO table2(id,name,content,date) VALUES (@id,@name,@content,@date)", connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdInsert.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
cmdInsert.Parameters.Add("@name",SqlDbType.NVarChar).Value = TextBox2.Text;
cmdInsert.Parameters.Add("@content",SqlDbType.NVarChar).Value = TextBox3.Text;
cmdInsert.Parameters.Add("@date",SqlDbType.NVarChar).Value = TextBox4.Text;
//4. 開啟資料庫執行SQL語法
cmdInsert.ExecuteNonQuery();
//----------------------------------------修改
//此SQL指令為更新table2的資料,資料表內id欄位所輸入的字串從TextBox而來
SqlCommand cmdUpdate = new SqlCommand("UPDATE table2 SET name = @name, content = @content, date = @date WHERE id = @id",connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdUpdate.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
cmdUpdate.Parameters.Add("@name",SqlDbType.NVarChar).Value = TextBox2.Text;
cmdUpdate.Parameters.Add("@content",SqlDbType.NVarChar).Value = TextBox3.Text;
cmdUpdate.Parameters.Add("@date",SqlDbType.NVarChar).Value = TextBox4.Text;
//4. 開啟資料庫執行SQL語法
cmdUpdate.ExecuteNonQuery();
//---------------------------------------刪除
//此SQL指令為刪除table2的某筆資料,TextBox1.Text輸入的字串為刪除依據
SqlCommand cmdDelete = new SqlCommand("DELETE FROM table2 WHERE id = @id",connect);
//3.2 建立具名參數的參數名稱,並指定參數所要帶入的資料來自TextBox
cmdDelete.Parameters.Add("@id",SqlDbType.NVarChar).Value = TextBox1.Text;
//4. 開啟資料庫執行SQL語法
cmdDelete.ExecuteNonQuery();
//5. 關閉資料連線
connect.Close();
2012年8月26日 星期日
為什麼我需要去愛
How should I have to love?
為什麼我需要去愛?
我想是因為想要好好記得
記得從陌生人到牽手的過程
我覺得這是一件很幸福的事情
那種不會因為任何事情而打斷的愛
我真的好羨慕
就算天塌下來 我還是要為了所愛的人撐住
不讓他受一絲一毫的傷
就是我所要的愛情
來談談我喜歡的女生會什麼樣子吧!
善解人意
比我成熟
獨立生活
喜歡小孩
不把錢財看得過重
不愛化妝
個性活潑
跟家人 跟我爸媽合得來
最重要的是 要能接受生小孩
而且會讓我有被電到 或是一見鍾情的感覺
基本上我所說的這些並不是很難找到
但是由於現在女性主義抬頭的關係
要女生生小孩不再是一件理所當然的事情
是沒錯 女生不一定得要生小孩
但是為什麼基因演化成女生具有生小孩的樣子呢?
而男生為什麼具有其他的樣子呢?
這是演化所產生的結果阿
再者 生不生其實不是一個人的事情
當你懷孕了 其實也代表男生必須準備好一切所需
ANYTHING ANYONE ANYWHERE
我會等到自己經濟獨立後 再開始進行找女友的動作
在這之前 我需要全力在自己的事情上
為什麼我需要去愛?
我想是因為想要好好記得
記得從陌生人到牽手的過程
我覺得這是一件很幸福的事情
那種不會因為任何事情而打斷的愛
我真的好羨慕
就算天塌下來 我還是要為了所愛的人撐住
不讓他受一絲一毫的傷
就是我所要的愛情
來談談我喜歡的女生會什麼樣子吧!
善解人意
比我成熟
獨立生活
喜歡小孩
不把錢財看得過重
不愛化妝
個性活潑
跟家人 跟我爸媽合得來
最重要的是 要能接受生小孩
而且會讓我有被電到 或是一見鍾情的感覺
基本上我所說的這些並不是很難找到
但是由於現在女性主義抬頭的關係
要女生生小孩不再是一件理所當然的事情
是沒錯 女生不一定得要生小孩
但是為什麼基因演化成女生具有生小孩的樣子呢?
而男生為什麼具有其他的樣子呢?
這是演化所產生的結果阿
再者 生不生其實不是一個人的事情
當你懷孕了 其實也代表男生必須準備好一切所需
ANYTHING ANYONE ANYWHERE
我會等到自己經濟獨立後 再開始進行找女友的動作
在這之前 我需要全力在自己的事情上
2012年8月15日 星期三
討厭的事
這兩天真的完全沒有精神 越來越討厭現在的狀況
C#越聽越不懂
JAVASCRIPT興趣也越來越低
語法記不熟 回到家懶的練習
感覺是在浪費自己的時間金錢
何況我在班上是個獨行俠 對沒錯我要改個性 但我就是覺得沒必要
提到金錢我也得反省
原本身上的錢至少夠修理機車
搞到現在身上連吃飯錢都快不夠了
媽的 我到底在幹嘛ㄚ
說好我不想靠家人
但卻不得不依賴了
還有車子
這台車最近碼表線斷了 我一直不想換
碟煞也有問題
大燈也歪一邊
我沒精神去搞了 除非必要我都搭公車
因為我不知道接下來他還會壞什麼
還有月底得跟朋友們吃飯
原本預計是可以全到
一下子有人出國
一下子有人丟出新條件
一直多出新的限制真的讓我想拉下臉
想想還是算了
講了也不會有什麼改變
何況有些事情早已經根深蒂固在朋友心中
浪費時間精神去講頂多只有一個免強的妥協
我看也該開始排時間了 不然到時候又要搞的亂七八糟
從上來到現在
光是非必要性支出已經高達一千五了
再下去我真的會倒
我發現我不能自己一個人太久
三不五時就得找人出去
不然自己一個人久了會開始胡思亂想
嘴巴不說 其實心裡千思萬緒
而且很奇怪
我不管打什麼在FACEBOOK
沒什麼人會回應
也許我們不再是好朋友了 對嘛?
永遠只會說我想太多 不要念
但有沒有想過 我為什麼要念
以前我還會認為我很了解你們
所以我們是好朋友
但現在 一切都不再是理所當然了
是不是哪天我不再關心妳們
反而你們會輕鬆些?
訂閱:
文章 (Atom)