Ado.net总结

Ado.net

组成:

1.DataSet 非连接的核心组件。独立于任何数据源的数据访问,多种不同的数据源

2.Data Provider(数据提供程序):用于连接数据库,执行命令,检索结果

SQLServer数据提供程序:System.Data.SqlClient命名空间

OLEDB的数据提供程序:System.Data.Olebd命名空间

ODBC的数据提供程序: System.Data.Ddbc命名空间

Oracle数据提供程序:System.Data.OracleClient命名空间

Connection 提供与数据源的连接 SqlConnection
Command 执行数据库命令的对象 SqlCommand
DataReader从数据源中提供快速的,只读的数据流 SqlDataReader
DataAdapter 提供DataSet对象与数据源的桥梁.Fill Update

Ado.Net访问数据的步骤

连接到数据库
打开连接
创建执行命令对象(创建命令)
执行命令
关闭连接

SqlConnection conn = new SqlConnection();
//打开门—需要钥匙,连接字符串—打开大门的钥匙
conn.ConnectionString = “”;//连接字符串
//conn.Database;要连接的数据库名称
//conn.DataSource 数据源 local . Ip,端口号
//conn.State//表示连接的状态
//conn.ConnectionTimeout 15

State: Closed Open Connecting Executing Fetching–正在检索数据 Broken–连接中断

连接字符串是什么?

字符串,一组被格式化的键值对,数据源在哪里,数据库名,提供什么样的访问信任级别,其他相关信息

格式:一组元素组成,一个元素---键值对,各个元素之间;隔开

SQLServer连接字符串

Sql server 身份验证

Data Source 数据源

Windows	   身份验证

//钥匙 字符串 一组被格式化了的键值对,数据源在哪里,数据库名,提供什么样访问信任级别,其他相关信息.

    //格式:一组元素组成,一个元素---键值对,各个元素之间用;隔开

    //Sql server 身份验证
    	Data Source  数据源  Initial Catalog 数据库名   User Id 账号  PassWord 密码

    Window身份验证
    	Data Source  数据源  Initial Catalog 数据库名 Integrated Security = True/SSPI
    												 Trusted_Connection = True


    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = "";//连接字符串
    //本地: local / .表示  远程: IP,端口号
    
    //SQL身份验证   安全连接
    string ConnStr = "Data Source = .; Initial Catalog = TestBase;User Id = lyc;Password = 123456;"
    
    //Data Source --- server   Initial Catalog---database 	User Id = uid 	Password--pwd
    

    //Windows身份验证    可信连接
    string connStr1 = "Data Source = .;Initial Catalog = TestBase;Integrated Security = SSPI";

构建连接字符串及配置
1、构建:
1.手动写

	SqlConnection conn = new SqlConneciton();
	string conStr = "server = .;database = TestBase;uid = lyc;pwd = 123456"
	conn.ConnectionString = connStr;

	conn.Open();


	conn.Close();

2.专门的类来构建连接字符串 DbConnectionStringBuilder 基类  SqlConnectionStringBuilder

	SqlConncetionStringBuilder connStrBuilder = new SqlConncetionStringBuilder();
	connStrBuilder.DataSource = ".";//设置数据源
	connStrBuilder.InitialCatalog = "TestBase";//数据库名
	connStrBuilder.UserId = "lyc";//账号
	connStrBuilder.Password = "123456";//密码
	connStrBuilder.Pooling = false;//禁用连接池
	connStrBuilder.
	string connStr = connStrBuilder.ConncetionString;

	//读取配置文件里的连接字符串
	//下面是ConnectionStrings
	string connStr = ConfigrationManager.ConnectionStrings["connStr"].ConnectionString//读取连接字符串
	//下面是appSettings
	string connStr = ConfigurationManager.AppSettings["connStr"].ToString();

程序代码中写连接字符串,如果要修改,过后重新编译,灵活性很差,如何解决这个问题?

怎么把连接字符串从配置文件中取出来

2、配置文件中存储
配置到文件中 写哪个位置? connectionString节点 appSetting节点中


<appSettings>
	<add key = "connStr" value = "server = .;datavase = TestBase;uid = lyc;pwd = 123456"/>
</appSettings>

string connStr = ConfigurationManager.ConncectionStrings[“connStr”].ConncetionString;
//创建conn第一种
SqlConncetion conn = new SqlConncetion();
conn.ConncectionString = connStr;

//2创建conn 推荐使用
SqlConnection conn1 = new SqlConnection(connStr);

Console.WriteLine( " D a t a S o u r c e : c o n n 1. D a t a S o u r c e " ) ; C o n s o l e . W r i t e L i n e ( "Data Source:{conn1.DataSource}"); Console.WriteLine( "DataSource:conn1.DataSource");Console.WriteLine("DataBase:{conn1.Database});

//打开连接,进行与数据的交互,操作数据,查询
conn1.Open();

//交互-----执行命令,查询,添加,更新,删除

conn1.Close(); //Dispose()

异常处理:
try{}catch(){}finally{}

连接池是什么?
优化:存放了一定数量的与数据库服务器的武理连接
需要—容器里取出一条空闲的连接,而不是创建一条新的连接

作用:减少了连接数据库的开销,从而提高了应用程序的性能

如何分配:
根据连接请求的类型,找到与它相匹配的连接池,尽力的分配一条空闲的连接
有空闲则返回空闲连接
已用完则创建新连接到连接池中
已到达最大连接数量,等待,知道有空闲的连接可以用

移除无效连接
不能正确的连接到数据库服务器的连接 连接池存储的与数据库服务器的连接数量是有限的

无效连接,我们应当移除。否则会浪费连接池空间 连接池管理器会处理无效连接的移除问题

回收连接
释放使用完的连接? 应当及时关闭或释放 conn对象的Close Dispose 都能使连接回到连接池

1.测试连接池的存在

2.三个属性

Max Pool Size:最大连接数 100
Min Pool Size:最小连接数 0

Pooling 是否启用连接池 true false

3.测试连接池启用与否的耗时

4.连接池类型区分测试

1.命令----T-SQL或存储过程—数据库里已创建好
SqlCommand 对SQLServer数据库执行的一个T-SQL语句或存储过程
SqlCommand对象:Ado.net中执行数据库命令的对象

2.重要属性:
Connection:SqlCommand对象使用的SQlConnection
CommandText:获取或设置要执行的T-SQL语句或存储过程名
CommandType:CommandType.Text—执行的是一个Sql语句
CommandType.StoreProcedure----执行的是一个存储过程
Parameters:SqlCommand对象的命令参数集合 空集合
Transaction:获取或设置要在其中执行的事务

3.SqlCommand创建

方法一:
string sql = "select * from UserInfos";
SqlCommand cmd = new Sqlcommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.CommandType = CommandType.StoreProcedure;//如果是存储过程,必须设置

方法二:
SqlCommand cmd1 = new SqlCommand(sql);
cmd.Connection = conn;

方法三:(推荐)
SqlCommand cmd2 = new SqlComand(sql,conn);

方法四:Connection对象
SqlCommand cm3 = conn.CreateCommand();
cmd.CommandText = sql;

//方法五:
string delSql = "delete from UserInfos where UserId  >  3";
SqlCommand cmd4 = new SqlCommand(delSql,conn,null);

ExecuteNonQuery介绍:
//创建命令
string uName = ‘jason’;
string uPwd = “1234”;
int age = 25;
int deptId = 3;
//拼接式SQL 致命弱点:很容易被SQL注入
string sql = “insert into UserInfos(UserName,UserPwd,Age,DeptId) values(“Name+”,”+pwd+","+age+","+deptId+")";
//创建执行命令的对象
SqlCommand cmd = new SqlCommand(sql,conn);

string delSql = "delete frin YserUbfis wgere UserId = 3";
//执行命令
//1.执行T-SQL语句并返回受影响的行数
//命令类型:插入,更新,删除-----DML数据操作语言
共有的条件:conn状态,必须是Open

//连接使用原则:最晚打开,最早关闭
conn.Open();

int count = cmd.ExecuteNonQuery();

ExecuteScalar方法

1、介绍:执行查询语句或存储过程,发挥查询结果集中的第一行第一列的值,忽略其他行或列
返回的值是

Object o = null;

string sql = "select * from UserInfos";
sqlCommand cmd = new SqlCommand(sql,conn);

conn.Open();

o = cmd.ExecuteScalar();

conn.Close();

2、作用:作查询 返回一个值 记录数 数据运算而出的结果
有时,插入数据后,想返回自动生成的标识列的值,也可以用这个方法

ExecuteReader 方法

//SqlDataReadr 数据流 实时读取 游标 指针 固定–不灵活:只进不出,只能前进不能后退
适用:只是读取数据,不做修改的情况下 数据量比较小
1.介绍
cmd.ExecuteReader

SqlDataReader = null;
SqlConnection conn = new SqlConncetion(connStr);
string sql = "select UserId,UserName,Age from UserInfos";

SqlCommand cmd = new SqlCommand(sql,conn);
try{
	conn.Open();

	dr = cmd.ExecuteReader();

}
catch(Exception ex)
{

	Console.WriteLine("执行查询异常");
	conn.close();
}
while(dr.Read())
{
	int userId = int.Parse(dr["UserId"].ToString());
	string userName = dr["UserName"].ToString();
	int age = int.Parse($"UserId:{userId},UserName:{userName},Age:{age}");
}
dr.Close();
conn.Close();

SqlParameter

定义 表示SqlCommand对象的参数,或与DataSet中列的映射

常用属性

DbType参数的SqlDbType(数据类型 数据库的类型而言)
Direction  参数的类型:输入 输出 输入输出 返回值参数
ParameterName 参数的名字
Size  最大大小 字节为单位
Value 参数的值
SqlValue 作为SQL类型的参数的值

构造方法

//参数的构造方法
//1.参数
SqlParameter pra1 = new SqlParameter();
pra1.ParameterName = "@userName";//参数名
pra1.SqlDbType = SqlDbType.VarChar;//数据类型
pra1.Value = "admin";//参数值
pra1.Size = 20;//大小


//2.参数名,值
Sqlparameter para2 = new Sqlparameter("@Age",24);


//3.参数名 SqlDbType
SqlParameter para3 = new SqlParameter("@DeptId",SqlDbType.Int);
para3.Size= 4;
para3.Value =3;


//4.参数名 类型 大小
SqlParameter para4 = new SqlParameter("@UserPwd",SqlDbType.Varchar,50)
para4.Value = "123456";


//5.参数名称 类型 大小 源列名(对应DataTable中的列名)
SqlParameter para5 = new SqlParameter("@UserName",SqlDbType.VarChar,20,"UName");

参数的作用
不带任何条件,不是通过参数传递,拼接SQL语句,生成SQL,具体的值

拼接SQL:容易被SQL注入---钻空子

防SQL注入

string sql = “select Age from UserInfos where UserName = @userName”;
SqlCommand cmd = new SqlCommand(sql,conn);

//cmd.Parameters.Add(new SqlParameter("@userName",“ling’ping”));

SqlParameter paraName = new SqlParameter("@userName",“ling’ping”);
cmd.Parameters.Add(paraName);

cmd.Parameters.AddWithValue("@userName",“ling’ping”);//单个参数添加,推荐使用这种

SqlParameter pra = cmd.Parameters.Add("@userName",SqlDbType.VarChar,20);
pra.Value = “ling’ping”;

//添加多个参数时使用
SqlParameter[] paras = {
new SqlParameter("@userName,“ling’ping”)
};
cmd.Parameters.AddRange(paras);

conn.Open();
object o = cmd.ExecuteScalar();
conn.Close();

Command添加参数的几个方法

cmd.Parameters.Add()
cmd.Parameters.AddWithValue()
cmd.Parameters.AddRange()

//输出参数的使用

string connStr = ConfigurationManager.ConnectionStrings[“connStr”].ConnectionString;
using(SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(“GetDeptName”,conn);
cmd.CommandType = CommandType.StoreProcedure;

//参数化Sql语句或一般存储过程里使用的是输入参数

SqlParemeter paraId = new SqlParameter("@DeptId",2);
cmd.Parameters.Add(paraId);//添加单个参数

//输出参数 是不传入值的,它是只输出值
SqlParameter paraName = new SqlParameter("@DeptName",SqlDbType.NVarChar,50);
paraName.Direction = ParameterDirection.Output;
cmd.Parameters.Add(paraName);

conn.Open();
cmd.ExecuteScalar();
conn.Close();

Console.WriteLine(paraName.value.ToString());

}

输入输出参数:

output进行表示 它需要传入值,也输出值,不用return
Value
Direction:InputOutput

返回值参数:
它不出现在存储过程中 只可以返回int类型 return返回的值
Direction:ReturnValue

SqlDataReader介绍

定义:提供一种从SQLServer数据库中读取只进的行流的方式

特点:快速的,轻量级的,只读的,遍历访问每一行数据的数据流,向一个方向,一行一行的,不能向后读取,不能修改数据

缺点:不灵活,只适合数据小的情况,读取数据,一直占用连接

读取方式:Read() 获取第一行的数据,再次调用Read()方法,
当调用Read()方法返回False时,就表示不再有数据行。

注意:
连接对象一直保持Open状态,如果连接关闭,是不能读取数据的。适用完成过后,应该马上调用
Close()关闭,不然Reader对象会一直占用连接的

创建方式:是不能直接构造的 cmd.ExecuteReader()来创建。
cmd.ExecuteReader(CommandBehaviour.CloseConnection)----好处:关闭reader对象时,就会自动关闭连接

读取时尽量使用与数据库字段类型相匹配的方法来取得对应的值,会减少因类型不一致而增加类型转换操作的性能损耗

没有读取到末尾就要关闭reader对象时,先调用cmd.Cancel(),然后再调用reader.Close();

cmd.ExecuteReader()获取存储过程的返回值或输出参数,先调用reader.Close(),然后才能获取参数的值

常用属性:
Connection:获取与Reader对象相关的SqlConnection
FiedCount:当前行中的列数
HasRows:reader是否包含一行还是多行
IsClose:reader对象是否关闭
Item[int]:列序号,给定列序号的情况,获取指定列的值
Item[String]:列名,获取指定列的值

常用方法
Close()
GetInt32(列序号)----根据数据类型相匹配的方法
GetFiledType(i) 获取数据类型的Type
GetName(列序号) 获取指定列的列名
GetOrdinal(列名) 获取指定列名的列序号
Read() 使dr前进到下一条记录
NextResult() 使dr前进道下一个记录

string sql = "select UserId,UserName,Age from UserInfos";
SqlCommand cmd = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);//创建
int indexId = dr.GerOrdinal("UserId");//获取指定列名的列序号
string idName = dr.GetName(0);//获取指定序列号的列名
int indexName = dr.GetOrdinal("UserName");
int indexAge = dr.GetOrdinal("Age");

DataTable详解

概念
DataSet:数据在内存中的缓存(数据库) Ado.Net核心组件. DataTable:内存中一个表(数据库中的一个表)

应用:DataSet中的成员使用中,它可以独立创建与使用
结合DataAdapter使用

架构:列和约束来表示
DataColumn 列

成员 行 DataRow

架构 DataTable() DataTable(表名)

常用属性
Columns 列集合 Rows 行的集合 Contraints 约束的集合 DataSet:DataTable所属的DataSet PrimaryKey 主键(列的数组)
TableName

方法
AcceptChanges() 提交更改
RejectChanges() 回滚更改
Clear() 清空数据
Copy() 复制架构和数据
Clone() 只复制架构,不包含数据
Load(IDataReader)通过提供的IDataReader,用某个数据源的值来填充DataTable,
Merge(DataTable) 合并 指定的dt合并到当前的dt里

  NewRow()创建一个DataRow,与Dt具有相同的架构
  Reset()将dt重置到最初状态
  Select() 获取dt所有的行的数组(条件,排序)

使用://独立创建与使用
DataTable dt1 = new DataTable(“UserInfo”);
//表示空的,没有架构 列 约束 主键
DataColumn dc = new DataColumn();
dc.ColumnName = “UserId”;
dc.DataType = typeof(int);
dt1.Columns.Add(dc);//添加一列
dt1.Columns.Add(“UserName”,type(string)); 添加一列 推荐
dt1.Columns.Add(“Age”,typeof(int));
dt1.PrimaryKey = DataColumn[]{dt1.Cloumns[0]};//设置主键
dt1.Constraint.Add(new UniqueConstraint(dt1.Columns[1]));//添加唯一约束
//架构定义好了,添加数据
DataRow dr = dt1.NewRow();//具有相同的架构
dr[0] = 1;
dr[“UserName”] = “admin”;
dr[“Age”]=24;

dt1.Rows.Add(dr);//添加到dt1里

dt1.AcceptChanges();//提交更改 Unchanged

dr["Age"] = 27;//修改 Modified 已修改

dt1.AcceptChanges();//Unchanged

dr.Delete();//Delete

dt1.AcceptChanges();

//DataRow ---RowState:Detached Added UnChanged Modified Deleted Detached

DataSet详解

概念:DataSet 数据在内存中的缓存—内存中的数据库,DataTable是内存数据库中的一个表
Ado.Net中的核心组件。数据库中的数据加载到内存中。

成员:一组DataTable组成 DataRelation 相互关联 一起实施了数据的完整性

应用:三种 结合DataAdapter使用
一、DataAdapter将数据填充到DataSet当中
二、DataAdapter将DataSet中的更改提交到数据库
三、XML文档或文档加载到DataSet中

作用:Ds将数据加载到内存中来执行,提高了数据访问的速度,提高硬盘数据的安全性,程序运行的速度和稳定性

特性:独立性:不依赖于任何数据库,离线和连接 数据视图 数据操作:灵活性

创建:DataSet() DataSet(名称)

常用属性
//创建
DataSet ds = new DataSet(“ds1”);//ds1为名称

ds.Tables.Add(dt1);//添加dt1到ds中
DataTable dt = ds.Tables[0];//获取表

//常用方法

ds.AcceptChanges();//提交
ds.RejectChanges();//回滚
ds.Clear();清除表中所有行的数据
ds.Copy();//复制结构和数据
ds.Clone();//复制架构,不包含数据
ds.Merge(rows/DataTable/dataSet);//合并
ds.Reset();

SqlDataAdapter是什么
适配器(桥接器),DataSet 数据之间用于检索和保存数据的桥梁

SqlDataAdapter类,填充DataSet以及更新数据源的一组数据库命令和一个数据库连接

它是如何提供桥接的?

Fill 填充到DataSet里 
Update 更改提交到数据库,使数据保持一致
SqlConnection SqlCommand一起使用,提高访问速度

4个重要属性
SelectCommand 查询 SqlCommand
InsertCommand 插入记录
UpdateCommand 更新数据库中的记录
DeleteCommand 删除记录

SqlDataAdapter对数据的操作也是建立在SqlCommand基础之上的

4种创建方式
SqlConncection conn = new SqlConnection(“server = .;database = TestBase;uid = lyc;pwd= 123456;providerName =System.Data.SqlClinet”/);
string conn = ConfigurationManager.ConncetionStrings[“connStr”].ConnectionString;

//1.设置SelectCommand
SqlDataAdapter adapter = new SqlDataAdapter();
SqlConnection conn = new SqlConnection(connStr);
string sql = "select * from UserInfos";
adapter.SelectCommand = new SqlCommand(sql,conn);


//2.通过一个SqlCommand对象来实例化一个adapter
SqlCommand cmd = new SqlCommand();
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);

//3.查询语句和连接对象来实例化一个adapter
SqlDataAdapter  adapter2 = new SqlDataAdapter(sql,conn);

//4.查询语句和连接字符串,也可以构建一个adapter?
SqlDataAdapter adapter3 = new SqlDataAdapter(sql,connStr);

//如果是T—SQL查询语句,选择第三种方式
//带参数,添加参数,SqlCommand 选择第二种或第一种
//不推荐第四种


填充数据 DataSet DataTable
{
	SqlDataAdapter da = new SqlDataAdapter(sql,conn);
	DataSet ds = new DataSet();
	//表名映射要在填充之前设置
	da.TableMapping.Add("Table","Users");
	da.TableMapping.Add("Table1","Dept");
	da.Fill(ds);
	//da.Fill(ds,"Users")
}

填充数据DataTable
{
	string sql0 = "select * from UserInfos";
	SqlDataAdapter da= new SqlDataAdapter(sql0,conn);
	DataTable dt = new DataTable("Users");
	da.Fill(dt);
}

更新数据到数据库
{
	string sql0 = "select * from UserInfos";
	SqlDataAdapter da= new SqlDataAdapter(sql0,conn);
	DataTable dt = new DataTable("Users");
	da.Fill(dt);//RowState---Unchanged  未更改的行
	
	dt.Rows[1]["UserName"] = "lulin";
	DataRow dr = dt.NewRow();
	dr["UserName"] = "Blue";
	dr["UserPwd"] = "123";
	dr["Age"] = 22;
	dr["DeptId"] = 3;
	dt.Rows.Add(dr);

	//更新时,Modified---已修改的---da.UpdateCommand
	//Added --- 已添加的行 ---- da.InsertCommand
	//Deleted ---- 已删除 ----- da.DeleteCommand

	//自动生成对应的Command执行命令
	sqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
	//为da手动配置命令
	SqlCommand insertCmd = new SqlCommand("insert into UserInfos (UserName,UserPwd,Age,DeptId)
	 values(@UserName,@UserPwd,@Age,@DeptId)",conn);

	 SqlParameter[] paras = {
	 	new SqlParameter("@UserName",SqlDbType.VarChar,50,"UserName"),
	 	new SqlParameter("@UserPwd",SqlDbType.VarChar,50,"UserPwd"),
	 	new SqlParameter("@Age",SqlDbType.Int,4,"Age"),
	 	new SqlParameter("@DeptId",SqlDbType.Int,4,"DeptId")
	 };
	 insertCmd.Parameters.Clear();
	 insertCmd.Parameters.AddRange(paras);
	 da.InsertCommand = insertCmd;
	da.Update(dt);
}


Fill 断开式 没有显式打开conn --- 自动打开conn --Adapter自动来做这件事--获取数据--填充到ds/dt里---自动关闭conn

Adapter更新数据集:

更新方式 Update(ds/ds/Rows) DataRow --RowState:Added Modified Deleted

配置对应的命令属性的方法
1、SqlCommandBuilder
2.手动配置

回顾事务知识

事务执行过程

Ado.Net如何调用事务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值