编程语言
首页 > 编程语言> > C#可视化二:ADO.NET基础

C#可视化二:ADO.NET基础

作者:互联网

知识点一:ADO.NET

简介
为什么需要ADO.NET 这门技术,C#程序需要访问数据库中的数据
微软公司提供的访问数据库技术,是.NET Framework中负责数据访问类库集,是应用程序和数据源之间的桥梁(不填充就没有数据)
作用范围:能够访问SQL Server数据库和XML等数据源;Oracle数据库

体系结构:

1,.NET Framework框架
汽车为什么踩油门就会加速,打方向盘就会转弯;
大家并不关心这些,只要知道我做出相应的操作,这个汽车会给我对应的反馈就行
汽车 -- 框架
方向盘 -- 框架中的某一个模块

.NET Framework 就是已经在底层封装好的代码得集合,只需要调用对应模块的代码就会自动帮你实现功能Console.WriteLine("Hello Wolrd");//就是调用的System 命名空间下Console类的WriteLine方法; 
执行这段代码之后就会弹出一个命令窗口,并且将“Hello World”显示在控制台

2,.NET Framework 数据提供程序:
针对3种不同的数据源进行操作:SQL Server,OLE DB, ODBC(不同的数据源提供程序放在对应命名空间)

SQL Server数据提供程序:访问SQL Server数据库
Connection --> SqlConnection 与数据源建立连接
Command --> SqlCommand 执行命令
DataReader --> SqlDataReader 获取结果集
DataAdapter --> SqlDataAdapter 将结果填充到DataSet

OLE DB 数据提供程序:用来访问支持OLE DB 数据访问方式的数据库;例如Access数据库,Excel

ODBC 数据提供程序:用来访问支持ODBC数据访问的数据库;Oracel数据库

3,DataSet 对象 --数据集(篮子,钱包(不管哪家银行取的钱,都能够放到钱包里))
独立于所有数据源而设计(有那些数据源SQL Server, OLE DB, ODBC)
在支持ADO.NET的断开式数据方案中起重要作用
将sql命令查询出来的结果集保存到内存中;程序不是直接访问的数据库中的数据,访问的是数据集中的数据

两种访问数据库的方式:
1,非断开式访问; (DataReader) 
2,断开式访问;(DataSet) 

有这样一个场景:打豆豆公司有4个客服,今天有50个客户来到了打豆豆公司所在的工业园,因为这个工业园很大,这50个客户找不到打豆豆公司具体在哪里,那么需要通过打电话的方式问路;
客户“钱多多”打电话给客服妹妹“小甜甜”;两种不同的问路方式



问路方式一对应的就是非断开式;问路方式二对应的是断开式;
因为公司只有4位客服,但是有50位客户;客服的电话接通后其他客户就没办法打电话进来了,只能等客服的电话不占线;
显然采用第二种问路方式,更多的客户能够打进来电话,效率更高;
同时采用第二种方式在通话的过程中出现断线的可能性相对要小一下;客户走到一半,电话突然断线,找不到路这个意外也就会更少发生;
但是,如果说,假如啊,这个客户他会瞬移,客服刚说完1句话,他就能够走到对应的位置,问路方式一和方式二的差别就不大了

 

知识点二:SqlConnection

Connection对象介绍:
数据源建立连接
属性:
ConnectionString  //连接数据库的连接字符串
State //当前连接对象的连接状态
方法:
Open() //打开连接
Close() //关闭连接

使用步骤:
1,设置连接字符串
1.1,连接字符串设置的2种方式:
windows 身份验证:"server=服务器名; database=数据库名; Integrated Security = true"
SQL Server 验证模式:“server=服务器名; database=数据库名; uId=用户名; pwd=密码”
1.2, 获取连接字符串
1.2.1, 根据模板拼接

string connStr = "Data Source=实例名称; Initial Catalog =数据库名称; Integrated Security =true; User Id=用户名; Password=密码";
string connStr = "server=实例名称; database=数据库名称; Integrated Security=true"; 
//上面两种方式都可以

1.2.2 ,VisualStudio SQLServer 对象资源管理器获取,右键--连接--属性--ConnString,添加上要连接的数据库名称:Initial Catalog字段和对应的值
2,命名空间的导入:手动导入,alt + enter代码提示导入
3,创建Connection 对象的实例
4,打开连接
5,执行命令
6,关闭连接

关键代码

SqlConnection conn = new SqlConnection("数据库连接字符串"); //获取连接对象,需要导入System.Data.SqlClient 命名空间
conn.Open(); //建立连接
//进行数据的操作.........
conn.Close(); //关闭连接
if (conn.State == ConnectionState.Open)
{
    Console.WriteLine("WuXia 数据库连接成功");
}

ConnectionState枚举值
连接状态的判断,需要导入 System.Data 命名空间
ConnectionState.Connecting --正在建立连接
ConnectionState.Open --连接处于打开状态
ConnectionState.Executing --连接处于打开状态
ConnectionState.Closed --连接处于管理状态

 

知识点三:Command对象

执行sql命令语句 --类似SSMS新建查询,写入一条sql语句,得到相应的结果

SSMS执行sql语句会有2种结果,Command对象通过调用对应的方法实现对应的功能
第一种是返回受影响的行数(增,删,改) --> int ExecuteNonQuery() //返回值为受影响的行数
第二种是返回结果集 --> 
方法一:DataReader ExecuteReader() //返回值为DataReader对象,暂时理解为结果集的读取工具(实际上结果集的这张表还是在SQL Server中)
方法二:object ExecuteScalar() //返回结果集的第一行第一列的值;通常用来获取带聚合函数sql命令的查询结果

属性, 方法
属性:
ConnectionText -->要执行的sql语句
Connection --> sql命令执行是建立在那条数据库的连接上的(相当于在那条线路上打问题的电话)
方法:
ExceuteNonQuery() //返回值为受影响的行数
ExecuteReader() //返回值为DataReader对象,暂时理解为结果集的读取工具
ExecuteScalar() //返回结果集的第一行第一列的值;

使用步骤(在创建连接的基础上) 1,设置连接字符串 2,导入命名空间 3,创建Connection 对象的实例 4,打开连接 5,执行命令 5.1,创建Command对象,使用要执行的sql语句和基于的连接 5.2,执行对应Command方法 6,关闭连接     int ExecuteNonQuery() 使用步骤 5.2,执行ExecuteNonQuery() 5.3,根据返回的收影响的行数判读sql命令是否执行成功   关键代码(在创建连接的基础上):  
string sql = "delete from Groups where groupId = 1"; //增,删,改 sql命令
SqlCommand command = new SqlCommand(sql,conn);//创建Command对象
int count = command.ExecuteNonQuery(); //返回收影响的行数
if (count > 0)
{
    Console.WriteLine("操作成功");
} else
{
    Console.WriteLine("操作失败");
}

DataReader ExecuteReader()
使用步骤
5.2 执行ExecuteReader方法,获取 DataReader对象
5.3 使用循环逐行读取记录(指定列名或者指定下标的形式)
5.4 关闭DataReader对象

关键代码(在创建连接的基础上)

string sql = "select * from Roles";
SqlCommand command = new SqlCommand(sql,conn); //创建Commond对象
//得到DataReader对象,使用DataReader对象读取查询的数据
SqlDataReader dataReader = command.ExecuteReader();
Console.WriteLine("groupId\tgroupName\taddress\tgroupTypeId"); //打印表头
while (dataReader.Read())
{
    string groupId = dataReader[0].ToString(); //通过指定下标形式
    string groupName = dataReader["groupName"].ToString(); //通过指定列名的形式
    string address = dataReader["address"].ToString();
    string groupTypeId = dataReader["groupTypeId"].ToString();
    Console.WriteLine("{0}\t{1}\t\t{2}\t{3}",groupId,groupName,address,groupTypeId); //打印获取到的数据
}
dataReader.Close(); //关闭DataReader对象

DataReader对象理解:

属性,方法
属性:
FieldCount -->获取每行数据的列数
HasRows  --> 当前结果集的行数是否大于等于1(就是说结果集是否有数据)
方法:
Read() //返回ture表明当前指针对应的行有记录,false则无;并且移动将读取数据的指针
Close() //关闭SqlDataReader对象
GetName() //根据下标获取列名(下标0表示第1列)

获取当前行指定列的值:
方式一:reader["列名"]  返回index 指向的一行的记录中指定列名的数据
方式二:reader[0] 返回index 指向的一行的记录中指定第几列的数据(第1列的下标为0)

因为对应的列可能是DataTime, int, double等不确定的数据类型,所以reader["列名"] 的数据类型为object(所有引用类型的父类),需要调用ToString()方法转换成字符串

ExecuteScalar()
使用步骤
5.2 执行ExecuteScalar方法,获取第一行第一列的值,如果结果集为空则返回null

关键代码

string sql = "select count(*) from Roles";
SqlCommand command = new SqlCommand(sql, conn); //创建Commond对象
object obj = command.ExecuteScalar();
Console.WriteLine("count" + obj.ToString());

一般用来获取带有聚合函数的sql语句的查询结果,比ExecuteReader()用起来要方便,其实用DataReader的方式也能够获取带有聚合函数sql语句的查询结果;

 

标签:DataReader,C#,数据源,数据库,对象,sql,ADO,NET,连接
来源: https://blog.csdn.net/spring_man/article/details/105781531