ADO.NET
ADO.NET
概述
ADO.NET 是 .NET 平台上“标准”的数据库访问组件,由 ADO 发展而来。
ADO 全称 ActiveX Data Objects(ActiveX数据对象),于1996 年由微软发布,它的作用是在 ODBC 和OLE DB 接口之上建立统一的数据库访问编程模型。
ADO.NET 位于 Sytem.Data 命名空间及其子命名空间,包含了两个组成部分:
- 用于接入数据库的 .NET Data Providers
- 用于操作数据的 Dataset
.NET Data Provider 数据提供程序
- Connection 对象提供了与数据源的连接
- Command 对象表示数据库命令,使用它可以获取,修改数据以及执行存储过程
- DataReader 对象是一个高性能的数据源“流”(Stream)
- DataAdapter 对象提供了 DataSet 对象与数据源之间的桥梁,DataAdapter 使用 Command 对象来执行 SQL 命令,可以把数据载入 DataSet 并将 DataSet 中的数据变化同步到数据源中
Connection 连接对象
连接字符串:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)
- SQL Server:
Server=【服务器地址】;Database=【数据库名】;uid=【用户名】;pwd=【密码】;Trusted_Connection=【可信连接】;
- Access:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=【数据文件地址】;User Id=admin;Password=;
- MySQL:
Server=【服务器地址】;Database=【数据库名】;Uid=【用户名】;Pwd=【密码】;
- DB2:
Server=【服务器地址】:【端口】;Database=【数据库名】;UID=【用户名】;PWD=【密码】;
- Oracle:
Data Source=TORCL;User Id=【用户名】;Password=【密码】;
- SQL Server:
添加信任和加密
Encrypt=True;TrustServerCertificate=True;
连接数据库
// 创建连接 using SqlConnection conn = new SqlConnection(connStr); // 打开连接 conn.Open();
Command 命令对象
创建命令
// 创建并执行 SqlCommand using(SqlCommand cmd = conn.CreateCommand()){ cmd.CommandText = "INSERT INTO T_Users(name,age) VALUES('小明',18)"; int count = cmd.ExecuteNonQuery(); }
创建 SqlCommand 设置参数,防止 SQL 注入
cmd.CommandText = "INSERT INTO T_Users(name,age) VALUES(@Name,@Age)"; SqlParameterCollection parms = cmd.Parameters; parms.Add(new SqlParameter("@Name", "小红")); parms.Add(new SqlParameter("@Age", 21)); int count = cmd.ExecuteNonQuery();
使用 DataReader 遍历查询结果
cmd.CommandText = "SELECT name,age FROM T_Users WHERE age>18"; using SqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) while (reader.Read()) Console.WriteLine($"Name: {reader.GetFieldValue<string>("name")}\tAge: {reader.GetFieldValue<int>("age")}");
DataSet 数据集
DataSet 可以使它与多个不同的数据源一起使用。ADO.NET 内置了 ODBC、OLEDB 以及 SQL Server 的 Data Provider,它们对应的命名空间分别为 System.Data.Odbc、System.Data.OleDb、System.Data.SqlClient
DataSet 是独立于数据源的数据访问对象,包含了行(DataRow)、列(DataColumn)、主键、外键、约束以及 DataTable 数据关系的信息。
DataSet 与 SqlDataReader:
- SqlDataReader 的查询结果放在数据库服务器中,读取结果时必须与数据库保持连接
- DataSet 的查询结果是放在本地内存中的,填充完成后,不需要与数据库保持连接
// 使用 DataSet cmd.CommandText = "SELECT name,age FROM T_Users WHERE age>18"; SqlDataAdapter adapter = new SqlDataAdapter(cmd); // 使用SQL命令初始化 SqlDataAdapter DataSet ds = new DataSet(); // 创建数据集 adapter.Fill(ds); // 使用适配器填充数据集 // 遍历数据集 foreach(DataRow row in ds.Tables[0].Rows) Console.WriteLine($"Name: {row.Field<string>("Name")}\tAge: {row.Field<int>("Age")}");
LINQ to DataSet
LINQ to DataSet 提供了 DataTable 和 DataRow 对象支持 LINQ 查询的功能
SqlDataAdapter adapter = new SqlDataAdapter("SELECT name,age FROM T_Users", connStr); // 直接使用命令字符串和连接字符串初始化适配器 DataSet ds = new DataSet(); adapter.Fill(ds, "T_Users"); // 填充数据到数据集的 T_Users 表中 DataTable? users = ds.Tables["T_Users"]; // 获取 T_Users 表 if(users != null) { // 使用 LINQ 查询并遍历结果 foreach(var row in users.AsEnumerable().Where(e => e.Field<int>("age") > 18)) Console.WriteLine($"Name: {row.Field<string>("Name")}\tAge: {row.Field<int>("Age")}"); }
ORM 及 Entity Framework
ORM:Object-relational mapping 对象-关系映射
在 .NET Core 上 对应的是 Entity Framework Core / EF Core。
EF 是对 Ado.Net 的封装,使用语言本身来操作数据库,而不用直接面对 DataTable 和 DataRow
LINQ to Entities 是用于使 Entity Framework 中的实体对象支持 LINQ 查询的组件
// Entity Framework 中的数据库上下文定义 public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } // 相当于 DataSet 中的 DataTable public DbSet<Post> Posts { get; set; } }