登入
RSS Feed

通过ADO.NET访问SQL Server数据库的登录、注册功能小实例(C# asp.net范例)

最早接触ADO.NET是在上个学期的VB.NET课上,那时候书上的实例是通过VB.NET制作一个管理系统,通过ADO.NET连接Access实现添加、删除、修改和查询(专科的教材就是这样),那时候就对ADO.NET弄得不是很清楚,后来寒假回家看了1/4寒假的算法,玩了3/4……于是这学期开C#后用ADO.NET就内牛满面了。
终于我还是抽空好好学习了一下,这里整理了一下我们正在学习的内容,这篇博文旨在弄清楚连接的方式和基本的对象、方法使用,通过一个登录和注册的小实例让大家理解,虽说很肤浅,但愿对于刚刚接触ADO.NET的并不熟悉的童鞋们还是有帮助的吧。
下面的代码部分,若一行没有显示完,将鼠标滑动到代码部分中,点击第二个按钮即可自动换行,若需要复制,点击第三个按钮即可变为文本格式复制。按钮的最后为当前代码的类型,请仔细看清。
因本人能力有限,文中仅为皮毛,还请大家笑纳,如代码中存在问题或想一起讨论可以直接回复,谢谢大家。

ADO.NET简介

使用ADO.NET访问数据库

1.配置SQL Server的sa用户 | 2.创建测试用的数据库和表 | 3.构成页面布局 | 4.连接数据库 | 5.对数据库进行查找 | 6.获取查找的值 | 7.对数据库添加数据

小总结

ADO.NET简介

其实你大可跳过这部分不看直接看后面,现阶段我们更多的去了解如何实现功能而不是如何创造功能
相信大家的书上都有ADO.NET的体系结构和对象模型图,通过ADO.NET我们可以轻松高效的与数据库通信。
ADO.NET体系结构
通过ADO.NET的体系结构可以看到左边的Data Provider部分是和不同数据库连接以获取数据,程序员就没必要为不同的数据库交互烦恼了,ADO.NET都为我们实现好了。右侧的Dataset是利用不同的Data Provider获得的数据储存起来在内存中建立数据视图。
ADO.NET对象模型
ADO.NET的对象模型中分为两类,一类是连接类,它需要直接与数据库通信,另一类为非连接类,允许用户脱机处理数据。关于类的具体内容我们后面的部分说。
关于ADO.NET更详细的原理可以参考MSDN: http://msdn.microsoft.com/zh-cn/library/e80y5yhx(v=vs.80).aspx

使用ADO.NET访问数据库

我们用C#来连接SQL Server,我虚拟机里的环境是Visual Studio 2005和SQL Server 2005,虽说现在都VS2012了,反正都差不多,能够触类旁通才是真的懂

配置SQL Server的sa用户

好了不罗嗦了,首先打开SQL Server,我们先配置一下sa用户,依次展开“安全性”——“登录名”,双击sa,若没有启用,双击sa,在弹出的“属性”窗口中选择“状态”,再启用sa账户。启用之后回到“常规”,修改sa用户的密码为sa,记得去掉“强制实施密码策略”的勾

当然,如果你不想修改密码只需要将后面代码中的sa密码修改成你自己的密码就行了。

创建测试用的数据库和表

确认后点击“新建查询”,输入并执行下面这段T-SQL语句

创建一个名为dbTest的数据库来实验,如果不幸的跟你的库重名了,为了避免麻烦建议你把自己的库导出或者改名或者把我的库改名。
之后在这个dbTest库中创建一个表,代码如下:

表中有两列,一列为username,用于存储用户名,另一列为password,用于存储密码,只是拿来演示主键标号什么的都省略了。

构成页面布局

随后可以启动Visual Studio了,创建一个网站(文件——新建——网站)并确保是C#编写的asp.net网站,随后在自动生成的default.aspx的HTML中插入一下HTML语句来插入一个表构成我们的一个大体结构,请记住替换其中的相应内容为VS中的控件


连接数据库

好了,随后我们在“这里放置按钮”的部分插入一个button,双击它进入后台代码。首先引用ADO.NET提供的连接SQLServer的命名空间。对于不同的数据库ADO.NET提供了不同的数据提供程序(Data Provider),具体可以通过MSDN了解:http://msdn.microsoft.com/zh-cn/library/gg145028.aspx

再在刚才button的click事件中添加如下代码:

首先我们创建一个连接字符串,连接字符串需要表明你的数据源(Data Source)数据库名(Initial Catalog)以及登录的用户名和密码(User ID和Password,这两项可以缩写为uid 和 pwd)。
数据源(Data Source)可以是本地,也就是代码中的localhost,也可以是计算机名、IP地址等。

随后,需要生成一个SqlConnection对象。Connection顾名思义是用来连接的,它通过我们定义的连接字符串来连接数据库。

我们在try…catch语句中操作,这是为了捕获到相应的错误。
光创建连接对象是不会自动连接到数据库的,所以要与数据库连接,就要使用连接对象的Open方法(第7行)。建议的做法是凡是打开就要关闭,所以我们在finally语句中加入一个关闭数据库连接的语句(第16行)。
那么现在来运行一下你的网站~点击一下刚刚插入的button(最好起个名字,比如“连接数据库”),按钮上面的Label就会显示出相应的状态~当一切正确的时候你会得到如下面这张图所示的结果

如果连接时哪里出现了问题,都会被SqlException提交给label显示给我们

比如并没有“sb”这个用户,但你却用它来登录了,或者是连接的数据库并不存在,这些都会产生异常。
如果只是连接数据库那么如上两步就好了!

对数据库进行查找

很显然,光是连接到数据库是没法对数据库进行操作的,于是我们继续进行查找。
这一步我们先在数据库中插入一条数据

当用户需要登录,点击了登录按钮后,应该到数据库中查找是否存在这样一个用户名,允许用户登录。不过为了“安全”起见,我们先要验证一下用户在TextBox中德输入是否正确。因为用户名是不能为空的:

之后我们重复上次的连接操作:

接着,回想一下当初创建Connection对象时是不是需要一个用于连接的字符串呢。
同样的,要想对数据库进行查询,我们需要用到Command对象,在此之前我们需要定义一个操作字符串来储存我们要执行的查询语句。

关于实例化Command对象,他的用法是:

你也可以选择下面的便于理解的写法,下面的3句和上面的一句是等效的:

如此一来我们就有一个可以对数据库进行查找的对象了。
那么查找如何返回值呢?我们需要Command的另一个方法ExecuteReader()来帮助我们返回值,接着需要SqlDataReader对象来接收。
也就是通过ExecuteReadr()方法来填充SqlDataReader对象

通过SqlDataReader对象的Read()方法可以逐行的扫描返回的结果,而且只能往前读取,当Read()返回的结果为false说明已经没有值了。
那么:如果用户登录首先要看用户名是否存在,若不存在用户输入的用户名,则没有数据填充到DataReader中,那么Read()方法返回的肯定是false。通过这样来判断是否有数据被填充(查询是否返回了内容)。

获取查找的值

同样的让我们来举一反三看看,当用户输入用户名和密码后点击登录,需要这样处理:

  1. 用户名、密码是否输入
  2. 用户名是否存在
  3. 若用户名存在密码是否与用户输入的密码相同

我们再插入一个button添加如下代码:

很容易的可以看出,上面代码部分只改变了查询语句(12行)和增加了一个else,那么他们具体是如何实现的呢?
通过strCmd我们查询用户输入的用户名的所有信息,即username和password被填充到sqlDr中。如用户输入的用户名为admin,则sqlDr内的数据则为:

username password
admin 123123

当用户名存在的时候,我们只需要比对密码是否相同就可以了。
由于DataReader对象中是以Object类型保存数据的,所以我们需要将其转换成字符串型(第26行)再用Equals方法进行比较(第28行),相同则返回true,登录成功;否则则为密码错误。
取出DataReader对象中当前读取到的值只需要

注意:由于我们采用DataReader对象的Read方法读取数据的,所以每一次只会有一行数据,你只需要取出指定列即可。
最后别忘了关闭连接(第37行)。

登录结果如图。

对数据库添加数据

通过前面我们已经能够使用ADO.NET来进行连接数据库、对数据库进行查询了,其实对数据库进行添加、删除或修改也是类似的,还记得之前提到过SqlCommand对象的ExecuteReader()方法可以将查询结果返回到SqlDataReader对象中,那增加、删除和修改这些没有返回值的SQL命令怎么办呢?
通过ExecuteNonQuere()方法(第35行)可以执行诸如上面提到的增加(INSERT)、删除(DELETE)、修改(UPDATE)等没有返回值的SQL命令,执行后返回被命令影响的行数

好了,其他的比如修改(制作一个修改密码的功能)只要将SQL语句修改一下再使用ExecuteNonQuery方法即可。
这样大体上大家都能通过ADO.NET与数据库连接和操作了吧!

小总结

  1. 创建连接字符串
  2. 生成连接对象
  3. 使用连接对象的Open方法打开数据库连接
  4. 定义操作字符串
  5. 实例化操作对象
  6. 执行SQL语句
  7. 当为查询语句时,通过SqlDataReader对象接收操作对象的ExecuteReader()方法返回的结果

    再通过SqlDataReader对象的Read()方法逐行、仅向前的取出数据。由于SqlDataReader对象是以Object类型存放数据的,因此取出时需要进行转换

    当Read()方法返回false时表示查询出的结果已经全部读取结束了

  8. 若是无返回的诸如添加、删除、修改这样的SQL语句则通过操作对象的ExecuteNonQuery()方法执行并可以返回SQL语句影响的行数
  9. 不论是SqlConnection对象还是SqlDataReader对象,打开后请一定记住关闭
标签: , , , , , .
  • Trackbacks
  • Comments
  • 暂时没有评论。

  • 暂时没有引用。

发表评论

*


  • 2018年六月
    « 9月    
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
  • Translate This Page

  • 微博

  • 文章归档

  • 标签

  • 近期文章

  • 分类目录