ado.net组成
数据提供程序
connection //连接对象
command
executeNonQuery //执行增删改
executeScalar //执行查询返回首行首列
executeReader //执行查询返回只读只进的结果集datareader
datareader
hasRow //是否有行
fieldCount //列的个数
dr["列名"]
dr.GetString(序号)
close()
dataadapter
数据集
dataset
作业:
1、用户界面中进行登录判断。输错三次禁止登陆,用数据库记录ErrorTimes。
如果用户名输入正确
密码输入错误
则错误次数+1 如果登陆错误次数==3
这时候不能登陆
2、数据导入:从文本文件导入用户信息。
3、数据导出:将用户信息导出到文本文件。
4、添加学生窗体
5、复习下树控件
把资料管理器的树形结构做出来

ADO.NET

为什么要学ADO.NET

之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据

什么是ADO.NET

ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSql Server一致

ADO.NET组成

数据提供程序

Connection

Command

DataReader只读只进的结果集

DataAdapter

程序集(DataSet) 断开时连接的数据库操作

第一个对象Connection

读取数据库数据之前先要创建一条路

读取Sql Server数据库使用

创建SqlConnection对象

获取连接字符串

VS视图-服务器资源管理器-数据库连接上点右键-添加连接 在新添的数据库上点右键 属性 里有连接字符串

string connStr = "Data Source=.\\sqlexpress;Initial Catalog=MySchool;Integrated Security=True";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
MessageBox.Show("数据库连接打开"); conn.Close();
MessageBox.Show("数据库连接关闭");

连接SQLServer

连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。

ADO.Net中通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理。执行备注中的代码如果成功了就ok。

using (SqlConnection conn = new SqlConnection(@"Data Source=.\\sqlexpress;Initial Catalog=MySchool;Integrated Security=True"))
{
conn.Open();
Console.WriteLine("连接成功!");
}

第二个对象Command

操作Sql Server数据库使用SqlCommand对象

SqlCommand表示向服务器提交的一个命令(SQL语句等) , CommandText属性为要执行的SQL语句,ExecuteNonQuery方法执行一个非查询语句(Update、Insert、Delete等)

常用的三个方法

ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数

ExecuteScalar() 执行查询,返回首行首列

ExecuteReader() 执行查询,返回DataReader对象

执行简单的增删改语句

SqlCommand的ExecuteNonQuery执行增删改操作

ExecuteNonQuery返回值是执行的影响行数

//执行数据库操作 3步

//打开连接 conn.Open();

//执行操作 result = cmd.ExecuteNonQuery();

//关闭连接 conn.Close();

使用using语句即使释放连接资源,不用再考虑是否关闭连接,推荐使用

练习

添加学生 编辑学生 删除学生

异常处理

在执行数据库操作时,如果数据库服务器未打开,或者sql语句写错了会怎么样?

可以使用try…catch…finally来捕获异常

使用异常处理可以保证一个功能出错不影响另一个功能,比如添加操作失败,不影响查询的操作

ExecuteScalar

SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。 cmd.CommandText = "select count(*) from student";

int i = Convert.ToInt32(cmd.ExecuteScalar())

cmd.CommandText = "select getdate()";

DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar());

得到自动增长字段的主键值,在values关键词前加上output inserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。 cmd.CommandText =“insert into class(cName,cDescription) output inserted.Id values(‘高三一班’,‘描述’)”;

int i = Convert.ToInt32(cmd.ExecuteScalar());

练习:添加学生窗体

执行查询

执行有多行结果集的用ExecuteReader

HasRow属性返回是否有行

HasRow属性返回是否有行
SqlDataReader reader = cmd.ExecuteReader();...
while (reader.Read())
{ Console.WriteLine(reader.GetString(1));
}

reader的GetString、GetInt32等方法只接受整数参数,也就是序号,

用GetOrdinal方法根据列名动态得到序号

更简单的方法reader[‘uUserName’]

为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用Dispose,SqlConnection、 SqlDataReader等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。

DataReader 必须独享一个Connection

案例:登陆练习

SQL注入漏洞攻击

登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中。
构造恶意的Password:' or '1'='1
if (dataReader.Read())
{
MessageBox.Show("登陆成功");
}
else
{
MessageBox.Show("登陆失败");
}
防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值

查询参数

SQL语句使用@UserName表示“此处用参数代替”,向SqlCommand的Parameters中添加参数

cmd.CommandText = "select * from [user] where uUserName=@UserName and uPwd=@Password";

cmd.Parameters.Add(new SqlParameter(“@ UserName ","admin"));

cmd.Parameters.Add(new SqlParameter(“@ Password ",password));

参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击。

案例

用户界面中进行登录判断。输错三次禁止登陆,用数据库记录ErrorTimes。

数据导入:从文本文件导入用户信息。

数据导出:将用户信息导出到文本文件。

练习

案例

省市选择程序,数据全部来自于数据库:http://www.programfan.com/blog/article.asp?id=28128把createtable中的varchar改为nvarchar,在Insert语句的汉字前面加上N(查找“,'”替换为“,N'”) ComboBox的显示值:Items.Add的参数是Object类型,也就是可以放任意数据类型的数据,可以设置DisplayMember属性设定显示的属性,通过SelectedItem属性取得到就是选择的条目对应的对象。例子。疑问:取出来的是Object,怎么能转换为对应的类型?变量名只是“标签”。显示的值和实际的对象不一样,在ASP.Net中也有相同的东西 创建一个ProvinceItem类,将数据填充在这个对象中添加到ComboBox中。 将连接字符串写在代码中的缺点:多次重复,违反了DRY(Don't Repeat Yourself)原则;如果要修改连接字符串就要修改代码。将连接字符串写在App.Config中: 添加App.config文件(文件名不能改):添加→新建项→常规→应用程序配置文件。App.config是.Net的通用配置文件,在ASP.Net中也能同样使用。 在App.config中添加connectionStrings段,添加一个add项,用name属性起一个名字(比如DbConnStr),connectionString属性指定连接字符串。 在“引用”节点上点右键“添加引用”,找到System.configuration。不是所有.Net中的类都能直接调用,类所在的Assembly要被添加到项目的引用中才可以。 ConfigurationManager.ConnectionStrings[" DbConnStr "].ConnectionString得到连接字符串。 如何在部署的程序中修改配置。

private void Form1_Load(object sender, EventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from promary";
using (SqlDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
ProvinceItem item = new ProvinceItem();
item.Id = dataReader.GetInt32(dataReader.GetOrdinal("proID"));
item.Name = dataReader.GetString(dataReader.GetOrdinal("proName"));
cmbProvince.Items.Add(item);
}
}
}
}
} private void cmbProvince_SelectedIndexChanged(object sender, EventArgs e)
{
cmbCity.Items.Clear();
ProvinceItem item = (ProvinceItem)cmbProvince.SelectedItem;
string connStr = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from city where proID=@proID";
cmd.Parameters.Add(new SqlParameter("proID",item.Id));
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string cityName = reader.GetString(reader.GetOrdinal("cityName"));
cmbCity.Items.Add(cityName);
}
}
}
}
}
} public class ProvinceItem
{
public int Id { get; set; }
public string Name { get; set; }
}

ado.net(class0503)的更多相关文章

  1. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

  2. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  3. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  4. ADO.NET一小记-select top 参数问题

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...

  5. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  6. 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你

    目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...

  7. ADO.NET Entity Framework 在哪些场景下使用?

    在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...

  8. ADO.NET 核心对象简介

    ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库,提供了数据访问的高层接口. ADO.NOT类库在System.Data命名空间内,根据我们访问的不同数据库选择命名空间,System. ...

  9. ODBC、OLE DB、 ADO的区别

    转自:http://blog.csdn.net/yinjingjing198808/article/details/7665577 一.ODBC ODBC的由来 1992年Microsoft和Syba ...

随机推荐

  1. hdu 1003(详解) java

    算法分析: 一列数   a[0],a[1],……a[i]…… 定义数组b[0],b[1,]……b[i]…… ***b[i]为i之前的任意位置到i的最大连续和!!! b[i]=max{b[i-1]+a[ ...

  2. 一个不错的log4j.properties例子

    # Set root logger level to WARN and append to stdout #在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error log4j.ro ...

  3. 计算机技能get(windows系统)

    1.快速打开程序,比如计算器,注册表,先按win键(不用再按win+r啦),输入程序名字,如calc,regedit等,直接打开. 2.自动左右分屏,win+上下左右方向键,win+↑ 最大化,win ...

  4. hive环境的搭建

    hive 默认用的是derby数据库存储源数据,在这改为 mysql来存储: 1.hive和关系数据库的对照关系 hive 所要查询的数据保存在HDFS中: hive 中的数据库和表对应HDFS中的文 ...

  5. 【C#设计模式——创建型模式】工场方法模式

    工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...

  6. Android列表视图(List View)

    Android列表视图(ListView) ListView是一个显示滚动项列表的示视图组(viewgroup),通过使用适配器(Adapter)把这些列表项自动插入到列表中.适配器比如从一个数组或是 ...

  7. hdu 4952 Number Transformation (找规律)

    题目链接 题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数 分析: 经过打表找规律,会发现最后的x/i,这个倍数会趋于一个固定的值, ...

  8. hdu 4941 Magical Forest ( 双重map )

    题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...

  9. HDU 4893 线段树

    比赛时太大意,斐波拉契数列开小了. 题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和. 解题思路:维护add[]数组表示 ...

  10. EASYUI+MVC4通用权限管理平台

    通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在平台开发完成后,特抽空总结一下平台知识,请各位在以后的时间里,关注博客的更新. 1.EASYUI+MVC4通用权限管理平台--前言 ...