ADO.NET学习系列(四)---窗体版的登录小程序

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 GO
    10
    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] ASC
    20 )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

    数据库脚本

*数据库表是我之前建好的,现在就直接导成脚本算了。现在来写存储过程

*根据用户名来查询信息(因为之前,我写了根据用户名来查询用户信息,但是现在我给之前写的存储过程改个名字)

我们可以使用:EXEC sp_rename ‘旧名‘, ‘新名‘,

这里我就不贴根据用户名,来查询用户信息的存储过程了,可以看我前面几个系列的文章。

*用户输入错误,给错误字段自增1的存储过程:

1  IF OBJECT_ID(‘Incre_errorTimes‘,‘P‘) IS NOT NULL
2  DROP PROCEDURE Incre_errorTimes
3  GO
4  CREATE PROCEDURE Incre_errorTimes
5  @userName nvarchar(10)
6  AS
7  UPDATE dbo.T_USERS SET T_ErrorTimes=T_ErrorTimes+1 WHERE T_NAME=@userName
8  GO
9  

*用户输入正确,给错误字段的值设置为0

1  IF OBJECT_ID(‘Reset_errorTimes‘,‘P‘) IS NOT NULL
2  DROP PROCEDURE Reset_errorTimes
3  GO
4  CREATE PROCEDURE Reset_errorTimes
5  @userName nvarchar(10)
6  AS
7  UPDATE dbo.T_USERS SET T_ErrorTimes=0 WHERE T_NAME=@userName
8  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                 else
133                 {
134                     MessageBox.Show("密码错误", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
135                     IncerErrTimes("Incre_errorTimes", new SqlParameter("@userName", usernName));
136
137                 }
138             }
139             else
140             {
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);

}

程序执行的效果图:

总的来说,通过做这个例子,我收获很大。大家呢?

时间: 2024-11-03 20:47:19

ADO.NET学习系列(四)---窗体版的登录小程序的相关文章

java版的QQ小程序

转载自:http://blog.csdn.net/lihongxun945/article/details/6114290 这是一个简单的java版的QQ小程序. 包括一个简单的服务器和一个简单的客户端. 运行时,先运行服务器,然后在运行客户端,就可以进行聊天了. 默认的配置是localhost,端口4545,更改ip就可以在两天电脑上进行聊天了. 目前不支持内网和外网之间的访问,也不支持多人聊天. 因为这只是一个简单的例子,感兴趣的同学可以通过改进,实现多人聊天和内外网之间的访问. 效果图:

Identity Server4学习系列四之用户名密码获得访问令牌

1.简介 Identity Server4支持用户名密码模式,允许调用客户端使用用户名密码来获得访问Api资源(遵循Auth 2.0协议)的Access Token,MS可能考虑兼容老的系统,实现了这个功能,但是不建议这么做. 2.实战一服务端配置 接着Identity Server4学习系列三的基础上,直接扩展里面的项目代码,让服务端同时支持密钥认证和用户名密码认证 第一步:扩展ThirdClients类,如下: /// <summary> /// 配置可以访问IdentityServer4

FineBI学习系列之FineBI官网提供的程序数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-31.html 目录: 1.描述 2.实现原理 3.案例 1.描述 由上一节BI可能通过设计器远程服务器的方式,以服务器数据集的形式来连接数据. 这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可

入华商用四周年,Office 365小程序在路上

微软市值已经在2018年4月17日那周初就悄然超越谷歌母公司Alphabet,成为仅次于苹果的全球第二大市值公司.投资银行摩根士丹利分析师凯什·韦斯(Keith Weiss)曾在2018年3月下旬发布的研报中称:"在公共云服务市场的有利地位,广泛的分效渠道,庞大的用户群,以及正在改善的利润率,将推动微软市值突破1万亿美元."该分析师认为,微软之所以能够脱颖而出,还要得益于其分析技术.机器学习和办公应用等. 在微软走向1万亿美元市场的过程中,Office 365云服务起着关键性作用.根据

2017-4-24 winform窗体基础属性 ico图片生成 不规则窗体的移动 恶搞小程序

1.客户端应用程序:C/S 特点:操作用户电脑上的文件 2.窗体分类: 记事本类型   ---  窗体可以随便拖动大小 计算器类型    ----  窗体固定大小,无最大化 无变宽类型  ---  杀毒软件 不规则类型   ---  桌面加速小球 置顶类型   ---  打开后不被其他窗体所掩盖,比如qq 3.窗体基础属性 布局: AutoScroll   --   控件超出窗体会自动出现滚动条 location --- 窗体距离桌面左上角的距离,需要配合StartPosition中的Manua

Android SDK范例源码学习系列四 AppNavigation

 (本系列基于Jelly Bean,Android OS4.2,API 17版本) 就算是最简单的应用程序也会拥有不止一项功能,因此我们经常要应对多个Activity.主Activity随应用程序启动而启动,可以通过触发事件开启另外的Activity.要想激活应用中的某个特定组件,可以用显式命名的Intent来实现,也可以采用隐式Intent,尽可能选用隐式的,它能为模块化功能提供强大的框架. 隐式Intent不需要指定要使用哪个组件,它们通过过滤器指定所需的功能,而Android系统必须决定使

Vue学习系列(四)——理解生命周期和钩子

前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过实例,探究vue的生命周期. 万物皆有灵,世间万物都拥有灵魂,小到山河湖海,花草树木,蚂蚁到人类,以及所有的动植物,大到地球星空和宇宙,都拥有灵魂,可以说他们都是有生命的,只是他们的生命形态是我们人类所不能理解的存在.在生产中,生命周期通俗来讲,就是从自然中来回到自然中去的全过程,也就是从采集材料设

[jQuery学习系列四 ]4-Jquery学习四-事件操作

前言:今天看知乎偶然看到中国有哪些类似于TED的节目, 回答中的一些推荐我给记录下来了, 顺便也在这里贴一下: 一席 云集 听道 推酷 青年中国说 SELF格致论道 参考:http://www.365mini.com/page/tag/jquery-event-methods 1,readyready()函数用于在当前文档结构载入完毕后立即执行指定的函数.该函数的作用相当于window.onload事件. 2,blindbind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数.举例:

ADO.NET学习系列(一)

一.ADO.NET基础 程序和数据库交互,要通过ADO.NET进行:通过ADO.NET就能在数据库中执行SQL了.ADO.NET中提供了对不同数据库的统一操作接口(ODBC).另外还有一种操作数据库的接口是JDBC. ADO.NET中通过SqlConnection类创建到SQL Server的链接,Sqlconnection代表一个数据库的链接,ADO.NET中的链接等资源都实现了IDisposable接口. 实现了IDisposable接口的对象,在使用完了,要进行资源的释放.调用Dispos