1.需求分析:做一個登錄的小程序,基于Winform的窗體小程序?;疽螅旱卿洺晒Γ簭椏蝻@示登錄成功,登錄失敗就彈框顯示失敗。
擴展功能:登錄次數超過3次,就”鎖定“用戶,提示登錄錯誤次數過多,不能登錄。用戶點擊之后,就退出程序;登錄成功,就把錯誤字段清零。
這里我們在數據庫表中,加一個錯誤字段,類型為int,初始值設置為0.
相信;這個小程序對于大家來說,是超級簡單的。我這里也是來熟悉一下,把基礎知識再鞏固一下。
2.用到的技術:ADO.NET,存儲過程。
3.項目實現:
1 USE [DB_USERS] 2 GO 3 4 /****** Object: Table [dbo].[T_USERS] Script Date: 06/07/2015 17:48:33 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO10 11 CREATE TABLE [dbo].[T_USERS](12 [T_ID] [INT] IDENTITY(1,1) NOT NULL,13 [T_NAME] [NVARCHAR](10) NOT NULL,14 [T_PWD] [NVARCHAR](10) NOT NULL,15 [T_AGE] [INT] NOT NULL,16 [T_ErrorTimes] [INT] NOT NULL,17 PRIMARY KEY CLUSTERED 18 (19 [T_ID] ASC20 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]21 ) ON [PRIMARY]22 23 GO
*數據庫表是我之前建好的,現在就直接導成腳本算了?,F在來寫存儲過程
*根據用戶名來查詢信息(因為之前,我寫了根據用戶名來查詢用戶信息,但是現在我給之前寫的存儲過程改個名字)
我們可以使用:EXEC sp_rename '舊名', '新名',
這里我就不貼根據用戶名,來查詢用戶信息的存儲過程了,可以看我前面幾個系列的文章。
*用戶輸入錯誤,給錯誤字段自增1的存儲過程:
1 IF OBJECT_ID('Incre_errorTimes','P') IS NOT NULL2 DROP PROCEDURE Incre_errorTimes3 GO 4 CREATE PROCEDURE Incre_errorTimes5 @userName nvarchar(10)6 AS 7 UPDATE dbo.T_USERS SET T_ErrorTimes=T_ErrorTimes+1 WHERE T_NAME=@userName8 GO 9
*用戶輸入正確,給錯誤字段的值設置為0
1 IF OBJECT_ID('Reset_errorTimes','P') IS NOT NULL2 DROP PROCEDURE Reset_errorTimes3 GO 4 CREATE PROCEDURE Reset_errorTimes5 @userName nvarchar(10)6 AS 7 UPDATE dbo.T_USERS SET T_ErrorTimes=0 WHERE T_NAME=@userName8 GO 9
數據庫表,和存儲過程弄好之后,我們可以來寫程序了
這里的連接字符串,我放在配置文件中,具體怎么操作,就不再贅述了。
編碼實現:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.Data; 11 using System.Data.SqlClient; 12 13 namespace 窗體的登錄程序 14 { 15 public partial class Login : Form 16 { 17 public Login() 18 { 19 InitializeComponent(); 20 } 21 /// <summary> 22 /// 增加錯誤次數 23 /// </summary> 24 public void IncerErrTimes(string sql, params SqlParameter[] parmeters) 25 { 26 //1創建連接對象 27 SqlConnection scon = new SqlConnection(DBHelper.GetConnectString()); 28 //2創建命令對象 29 SqlCommand scmd = new SqlCommand(); 30 scmd.CommandText = sql; 31 scmd.CommandType = CommandType.StoredProcedure; 32 scmd.Connection = scon; 33 //3打開連接 34 scon.Open(); 35 36 //配置參數 37 foreach (SqlParameter item in parmeters) 38 { 39 scmd.Parameters.Add(item); 40 41 } 42 43 //4執行命令 44 //5.處理數據 45 scmd.ExecuteNonQuery(); 46 47 //6關閉連接 48 scon.Close(); 49 50 51 } 52 53 /// <summary> 54 /// 充置錯誤次數 55 /// </summary> 56 public void ResetErrTimes(string sql, params SqlParameter[] parmeters) 57 { 58 //1創建連接對象 59 SqlConnection scon = new SqlConnection(DBHelper.GetConnectString()); 60 //2創建命令對象 61 SqlCommand scmd = new SqlCommand(); 62 scmd.CommandText = sql; 63 scmd.CommandType = CommandType.StoredProcedure; 64 scmd.Connection = scon; 65 //3打開連接 66 scon.Open(); 67 68 //配置參數 69 foreach (SqlParameter item in parmeters) 70 { 71 scmd.Parameters.Add(item); 72 73 } 74 //4執行命令 75 //5.處理數據 76 scmd.ExecuteNonQuery(); 77 78 //6關閉連接 79 scon.Close(); 80 81 } 82 83 private void btnLogin_Click(object sender, EventArgs e) 84 { 85 //獲取用戶輸入的用戶名和密碼 86 string usernName = txtLoginName.Text.Trim(); 87 string passWord = txtPassword.Text.Trim(); 88 89 //連接方式訪問數據庫 90 91 //1.創建連接對象(連接字符串) 92 SqlConnection scon = new SqlConnection(DBHelper.GetConnectString()); 93 94 //2創建命令對象 95 SqlCommand scmd = new SqlCommand(); 96 scmd.CommandText = "GetUserInfoByName"; 97 scmd.CommandType = CommandType.StoredProcedure; 98 scmd.Connection = scon; 99 100 //3打開連接101 scon.Open();102 103 //配置參數104 SqlParameter parameter = new SqlParameter();105 parameter.ParameterName = "@name";106 parameter.DbType = DbType.String;107 parameter.Value = usernName;108 parameter.Direction = ParameterDirection.Input;109 scmd.Parameters.Add(parameter);110 111 //4執行命令112 SqlDataReader reader = scmd.ExecuteReader(CommandBehavior.CloseConnection);113 114 115 116 //5.處理數據。117 if (reader.Read())118 {119 int errorTimes =(int)reader["T_ErrorTimes"];120 if (errorTimes > 3)121 {122 MessageBox.Show("登錄錯誤次數過多", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);123 return;124 }125 126 if (password == reader.GetString(reader.GetOrdinal("T_PWD")))127 {128 MessageBox.Show("登錄成功", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information);129 ResetErrTimes("Reset_errorTimes", new SqlParameter("@userName", usernName));130 131 }132 else133 {134 MessageBox.Show("密碼錯誤", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Error);135 IncerErrTimes("Incre_errorTimes", new SqlParameter("@userName", usernName));136 137 }138 }139 else140 {141 MessageBox.Show("用戶名不存在", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);142 }143 144 //6.關閉連接145 reader.Close();146 147 148 }149 }150 }
實現這個功能的過程中,遇到了幾個問題:
1.創建存儲過程的時候,使用的參數是@userName。而根據用戶名查詢用戶的信息的存儲過程只用的參數是@name,這兩個搞混了,應該分開來。。
2.創建一個封裝查詢的方法 public void ResetErrTimes(string sql, params SqlParameter[] parmeters)和 public void IncerErrTimes(string sql, params SqlParameter[] parmeters)的時候,寫成了 public void ResetErrTimes(string sql, params string[] parmeters)導致后面調用這個方法的時候,報錯。
3.循環添加參數的時候,寫錯了,我之前寫成了:
foreach (var item in parmeters)
{
scmd.Parameters.Add(parmeters); //這是錯誤的。
}
4.存儲過程的改名:EXEC sp_rename '舊名', '新名'
正確的應該是:
foreach (SqlParameter item in parmeters)
{
scmd.Parameters.Add(item);
}
程序執行的效果圖:
總的來說,通過做這個例子,我收獲很大。大家呢?
新聞熱點
疑難解答