透過簡單登入範例,練習 ADO.NET 連線、參數化查詢、預存程序呼叫,並封裝為可重用的使用者類別。
Default.aspx:登入介面 (帳號、密碼、登入按鈕)。LogSuccess.htm、LogFailure.htm:結果導向頁。
CREATE DATABASE test;
CREATE TABLE [User] (
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserName NVARCHAR(50) NOT NULL,
PassWord NVARCHAR(50) NOT NULL
);
string strComm = "Select * from Users where UserName ='" + UserName.Text + "' and PassWord= '" + PassWord.Text + "'";
⚠ SQL Injection 風險。
string strComm = "SELECT COUNT(*) FROM [User] WHERE UserName=@UserName AND PassWord=@PassWord";
SqlCommand comm = new SqlCommand(strComm, conn);
comm.Parameters.AddWithValue("@UserName", UserName.Text);
comm.Parameters.AddWithValue("@PassWord", PassWord.Text);
int count = (int)comm.ExecuteScalar();
CREATE PROC sp_ValidateUser @UserName NVARCHAR(50), @PassWord NVARCHAR(50)
AS SELECT COUNT(*) FROM [User] WHERE UserName=@UserName AND PassWord=@PassWord
SqlCommand comm = new SqlCommand("sp_ValidateUser", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@UserName", UserName.Text);
comm.Parameters.AddWithValue("@PassWord", PassWord.Text);
public class User
{
public string UserName { get; set; }
public string PassWord { get; set; }
public bool Validate()
{
// 使用參數化查詢或預存程序
// 回傳驗證結果
}
}
頁面代碼:
User u = new User { UserName = UserName.Text, PassWord = PassWord.Text };
if (u.Validate()) Response.Redirect("LogSuccess.htm");
else Response.Redirect("LogFailure.htm");
從直觀寫法進化至參數化、預存程序、物件封裝,是資料存取代碼品質提升的必經之路。