-----box----- 程式1 InsertMember Stored Procedure – 負責執行新增記錄的動作。 CREATE PROCEDURE dbo.InsertMember ( @MemberID int output, @MemberName nvarchar(16), @Age int, @Password nvarchar(16), @Email nvarchar(32), @Phone nvarchar(16), @IsAdmin bit ) AS Insert Into Members(MemberName, Age, Password, Email, Phone, IsAdmin) Values(@MemberName, @Age, @Password, @Email, @Phone, @IsAdmin) Select @MemberID=@@IDENTITY RETURN -----end----- -----box----- 程式1 InsertMember Stored Procedure – 負責執行新增記錄的動作。 CREATE PROCEDURE dbo.InsertMember ( @MemberID int output, @MemberName nvarchar(16), @Age int, @Password nvarchar(16), @Email nvarchar(32), @Phone nvarchar(16), @IsAdmin bit ) AS Insert Into Members(MemberName, Age, Password, Email, Phone, IsAdmin) Values(@MemberName, @Age, @Password, @Email, @Phone, @IsAdmin) Select @MemberID=@@IDENTITY RETURN -----end----- -----box----- 程式3 UpdateMember Stored Procedure – 負責執行修改記錄的動作。 CREATE PROCEDURE dbo.UpdateMember ( @MemberID int, @MemberName nvarchar(16), @Age int, @Password nvarchar(16), @Email nvarchar(32), @Phone nvarchar(16), @IsAdmin bit ) AS Update Members Set MemberName=@MemberName, Age=@Age, Password=@Password, Email=@Email, Phone=@Phone, IsAdmin=@IsAdmin Where MemberID=@MemberID RETURN -----end----- -----box----- 程式4 SelectMember Stored Procedure – 負責執行查詢記錄的動作。 CREATE ALTER PROCEDURE dbo.SelectMember ( @MemberID int ) AS Select * from Members Where MemberID= @MemberID RETURN -----end----- -----box----- 程式5 LoginCheck Stored Procedure – 負責執行登入檢查的動作。 CREATE PROCEDURE dbo.LoginCheck ( @MemberName nvarchar(16), @Password nvarchar(16) ) AS Select Count(*) from Members Where MemberName=@MemberName And Password=@Password RETURN -----end----- -----box----- 程式6 DALbase父類別 using System.Data.SqlClient; public class DALbase { private string strConn="資料庫連線資訊"; private SqlConnection conn=null; public DALbase() {} public SqlConnection OpenConnection() { //建立SqlConnection類別的物件 conn=new SqlConnection(strConn); //開啟連線 conn.Open(); //傳回建立好的SqlConnection類別的物件 return conn; } public void CloseConnection() { //關閉連線 conn.Close(); //丟棄SqlConnection類別的物件 conn.Dispose(); } } -----end----- -----box----- 程式7 Member_DAL類別 using System.Data.SqlClient; using System.Data; public class Member_DAL : DALbase { public void SelectMember(Member m) { //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("SelectMember", conn); //設定CommandType屬性 cmd.CommandType= CommandType.StoredProcedure //建立SqlParameter類別的物件; SqlParameter p=new SqlParameter( "@MemberID", SqlDbType.Int); //設定Direction屬性 p.Direction=ParameterDirection.Input; //設定Value屬性 p.Value=m.MemberID; //把建好的SqlParameter類別的物件加到 //cmd物件的Parameters集合中 cmd.Parameters.Add(p); //執行查詢 SqlDataReader dr=cmd.ExecuteReader(); //取得符合查詢條件的第一筆記錄 dr.Read(); //把記錄的MemberName欄位的內容指派給 //m參數的Name屬性 m.Name=dr["MemberName"].ToString(); //省略指派其他欄位內容值不列 //關閉SqlDataReader類別的物件 dr.Close();  //丟棄SqlCommand類別的物件 cmd.Dispose();  //呼叫父類別的OpenConnection方法 CloseConnection(); } public int InsertMember(Member m) { //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("InsertMember", conn); //設定CommandType屬性 cmd.CommandType= CommandType.StoredProcedure; //建立SqlParameter類別的物件 SqlParameter p1=new SqlParameter( "@MemberID", SqlDbType.Int); //設定Direction屬性 p1.Direction=ParameterDirection.Output; //把建好的SqlParameter類別的物件加到 //cmd物件的Parameters集合中 cmd.Parameters.Add(p1); //省略準備其他參數的程式碼不列 //執行新增記錄的動作 cmd.ExecuteNonQuery(); //取回新增記錄的MemberID欄位內容值 int MemberID=(int) cmd.Parameters["@MemberID"].Value; //丟棄SqlCommand類別的物件 cmd.Dispose(); //呼叫父類別的OpenConnection方法 CloseConnection(); //傳回新增記錄的MemberID欄位內容值 return MemberID; } public void DeleteMember(int MemberID) { //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand( "DeleteMember", conn); //設定CommandType屬性 cmd.CommandType= CommandType.StoredProcedure; //建立SqlParameter類別的物件 SqlParameter p1=new SqlParameter( "@MemberID", SqlDbType.Int); //設定Direction屬性 p1.Direction=ParameterDirection.Input; //設定Value屬性 p1.Value=MemberID; //把建好的SqlParameter類別的物件加到 //cmd物件的Parameters集合中 cmd.Parameters.Add(p1); //執行刪除記錄的動作 cmd.ExecuteNonQuery(); //丟棄SqlCommand類別的物件 cmd.Dispose(); //呼叫父類別的OpenConnection方法 CloseConnection(); } public void UpdateMember(Member m) { //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("UpdateMember", conn); //設定CommandType屬性 cmd.CommandType= CommandType.StoredProcedure; //建立SqlParameter類別的物件 SqlParameter p1=new SqlParameter( "@MemberID", SqlDbType.Int); //設定Direction屬性 p1.Direction=ParameterDirection.Input; //設定Value屬性 p1.Value=m.MemberID; //把建好的SqlParameter類別的物件加到 cmd物件的Parameters集合中 cmd.Parameters.Add(p1); //省略準備其他參數的程式碼不列 //執行更新記錄的動作 cmd.ExecuteNonQuery(); //丟棄SqlCommand類別的物件 cmd.Dispose(); //呼叫父類別的OpenConnection方法 CloseConnection(); } public bool Login(string MemberName, string Password) { //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("LoginCheck", conn); //設定CommandType屬性 cmd.CommandType= CommandType.StoredProcedure; //建立SqlParameter類別的物件 SqlParameter p1=new SqlParameter( "@MemberName", SqlDbType.NVarChar, 16); //設定Direction屬性 p1.Direction=ParameterDirection.Input; //設定Value屬性 p1.Value=MemberName; //把建好的SqlParameter類別的物件加到 //cmd物件的Parameters集合中 cmd.Parameters.Add(p1); //省略準備其他參數的程式碼不列 //執行查詢記錄的動作 int n=(int)cmd.ExecuteScalar(); //丟棄SqlCommand類別的物件 cmd.Dispose(); //呼叫父類別的OpenConnection方法 CloseConnection(); //傳回登入檢查的結果 return (n==0) ? false : true; } } -----end----- -----box----- 程式8 NUnit_Setup Stored Procedure – 負責執行測試資料庫的初始化 CREATE PROCEDURE dbo.NUnit_Setup AS exec NUnit_TearDown exec InsertMember 1, 'John', 10, 'password', 'jdoe@test.com', '11111111', 0 exec InsertMember 1, 'Jane', 20, 'password', 'jsmith@test.com', '22222222', 0 exec InsertMember 1, 'Admin', 30, 'password', 'admin@test.com', '33333333', 1 RETURN -----end----- -----box----- 程式9 NUnit_TearDown Stored Procedure – 負責清除測試資料庫中的記錄 CREATE PROCEDURE dbo.NUnit_TearDown AS truncate table Members RETURN -----end----- -----box----- 程式10 TestBase類別 using System.Data.SqlClient; public class TestBase { public TestBase() {} private string strConn="…"; private SqlConnection conn=null; public SqlConnection OpenConnection() { //建立SqlConnection類別的物件 conn=new SqlConnection(strConn); //開啟連線 conn.Open(); //傳回建立好的SqlConnection類別的物件 return conn; } public void CloseConnection() { //關閉連線 conn.Close(); //丟棄SqlConnection類別的物件 conn.Dispose(); } } -----end----- -----box----- 程式11 TestMember類別 using NUnit.Framework; using System.Data.SqlClient; [TestFixture] public class TestMember : TestBase { //製作負責執行資料庫初始化的方法 [SetUp] public void SetUp() {  //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection();  //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("NUnit_Setup", conn); //設定CommandType屬性 cmd.CommandType=  CommandType.StoredProcedure; //執行新增記錄到資料庫的動作 cmd.ExecuteNonQuery();  //丟棄SqlCommand類別的物件 cmd.Dispose();  //呼叫父類別的OpenConnection方法 CloseConnection(); } //製作負責清除資料庫記錄的方法 [TearDown] public void TearDown() {  //呼叫父類別的OpenConnection方法 SqlConnection conn=OpenConnection(); //建立SqlCommand類別的物件 SqlCommand cmd=new SqlCommand("NUnit_TearDown", conn); //設定CommandType屬性 cmd.CommandType=  CommandType.StoredProcedure; //執行清除資料庫記錄的動作 cmd.ExecuteNonQuery();  //丟棄SqlCommand類別的物件 cmd.Dispose();  //呼叫父類別的OpenConnection方法 CloseConnection(); } //製作測試新增記錄的方法 [Test] public void InsertMember() {  //建立Member類別的物件 Member m=new Member();  //設定Member類別的物件的Name屬性 m.Name="Test";  //設定Member類別的物件的Password屬性 m.Password="abc";  //設定Member類別的物件的Age屬性 m.Age=10;  //設定Member類別的物件的Email屬性 m.Email="test@test.com";  //設定Member類別的物件的Phone屬性 m.Phone="12345678";  //執行新增記錄的動作並取回新增記錄的  //會員代號 int MemberId = m.InsertMember();  //檢驗會員代號是否大於0 Assertion.Assert(MemberId > 0); } //製作測試查詢記錄的方法 [Test] public void SelectMember() {  //建立Member類別的物件 Member m=new Member(1); //執行查詢記錄的動作 m.SelectMember(); //判斷查詢得到的MemberID是否有誤 Assertion.AssertEquals("MemberID有誤!", 1, m.MemberID); //判斷查詢得到的MemberName是否有誤 Assertion.AssertEquals("MemberName有誤!", "John", m.Name); //判斷查詢得到的Age是否有誤 Assertion.AssertEquals("Age有誤!", 10, m.Age); //判斷查詢得到的Password是否有誤 Assertion.AssertEquals("Password有誤!",  "password", m.Password); //判斷查詢得到的Email是否有誤 Assertion.AssertEquals("Email有誤!",  "jdoe@test.com", m.Email); //判斷查詢得到的Phone是否有誤 Assertion.AssertEquals("Phone有誤!",  "11111111", m.Phone); //判斷查詢得到的IsAdmin是否有誤 Assertion.AssertEquals("IsAdmin有誤!",  false, m.IsAdmin); } //製作測試更新記錄的方法 [Test] public void UpdateMember() {  //建立Member類別的物件 Member m=new Member(2);  //設定Member類別的物件的Name屬性 m.Name="UpdateTest";  //設定Member類別的物件的Password屬性 m.Password="abc";  //設定Member類別的物件的Age屬性 m.Age=10;  //設定Member類別的物件的Email屬性 m.Email="test@test.com";  //設定Member類別的物件的Phone屬性 m.Phone="12345678";  //執行新增記錄的動作 m.UpdateMember();  //建立Member類別的物件 Member mu=new Member(2);  //查詢剛剛更新的記錄的內容是否有正確更新 mu.SelectMember();  //檢驗MemberName欄位的內容是否更新成功 Assertion.AssertEquals("MemberName有誤!",  "UpdateTest", mu.Name); } //製作測試刪除記錄的方法 [Test] [ExpectedException(typeof(InvalidOperationException))] public void DeleteMember() {  //建立Member類別的物件 Member m=new Member(3);  //執行刪除記錄的動作 m.DeleteMember(m.MemberID);  //建立Member類別的物件 Member md=new Member(3);  //查詢剛剛被刪除的記錄 md.SelectMember(); //取得被刪除記錄的MemberName欄位的內容值 //,如果會發生例外,表示刪除記錄//成功, //因為被刪除記錄不會有MemberName欄位, //也不會有內容值 Assertion.AssertEquals("MemberName有誤!",  "DeleteTest", md.Name); } //製作測試登入成功的方法 [Test] public void LoginSuccess() {  //建立Member類別的物件 Member m=new Member();  //設定Member類別的物件的Name屬性 m.Name="John";  //設定Member類別的物件的Password屬性 m.Password="password";  //執行登入動作,如果帳號和密碼正確則 //登入成功 bool bSuccess=m.Login();  //判斷是否登入成功 Assertion.AssertEquals("登入失敗!",  true, bSuccess); } //製作測試登入失敗的方法 [Test] public void LoginFailure() {  //建立Member類別的物件 Member m=new Member();  //設定Member類別的物件的Name屬性 m.Name="John123";  //設定Member類別的物件的Password屬性 m.Password="password";  //執行登入動作,如果帳號和密碼不正確則  //登入失敗 bool bSuccess=m.Login();  //判斷是否登入失敗 Assertion.AssertEquals("登入失敗!",  false, bSuccess); } } -----end-----