NET Framework带有自己的数据访问技术ADO.NET。ADO.NET由托管类组成,这些托管类允许.NET应用程序通过这些类连接到数据源,执行命令以及管理非连接的数据。ADO.NET将数据访问与数据处理分离主要通过两个主要的组件Data Provider和DataSet来完成操作
Data Provider :
数据提供程序是一组用于访问特定数据库,执行SQL命令并获取值的ADO.NET类。就本质而言,Data Provider 是应用程序和数据源之间的一座桥梁。它提供了执行数据库操作所需的所有对象;
Connection:打开和关闭数据库连接,查询数据库的表和视图,执行命令以及更新存储在数据库中的数据。
Command:用于执行在数据库中执行各种操作,如查询和更新。它可以用来执行 SQL 语句或存储过程,并返回请求的数据结果。它也可以用来获取影响行数,执行带有参数的命令等。(存储过程是一组记录在数据库中的 SQL 语句,可以执行复杂的查询和操作。它们遵循一个特定的程序,允许你将一组查询的执行集中放在一个文件中,从而可以更快更有效地访问数据库。 )
DataReader:可以用来读取来自数据源的只进流式数据(数据源:指的是数据存储介质,比如关系型数据库、文本文件、Excel 表格等;只进流式数据:指的是将数据一条一条地按照一定的顺序流式地传输,只能以向前遍历的方式获取并处理)。
DataAdapter:从数据源检索数据并将其填充到 DataSet 中,或将 DataSet 中的数据更新回数据源。
DataSet:
当我们需要从数据库中获取多个表的数据时,我们可以使用 DataSet 对象。DataSet 是一个内存中的数据缓存,它可以存储多张数据表(DataTable),并且可以在这些表之间建立关系。DataSet 可以脱离数据源,也就是说,我们可以在 DataSet 中缓存数据,然后断开与数据源的连接,这样就可以离线操作数据,不需要实时连接数据库。
ADO.NET数据库的访问流程
一,基于连接的
1. 建立数据库连接:使用Connection对象,调用其Open()方法来打开与数据库的连接。
2. 创建命令对象:使用Command对象,定义需要执行的SQL命令。
3. 执行命令并获取结果:使用DataReader对象,通过ExecuteReader()方法执行SQL命令,并返回一个结果集(DataReader对象)。
4. 关闭数据库连接:使用Connection对象,调用其Close()方法来关闭与数据库的连接。
二,基于非连接的
1. 创建连接对象:使用Connection对象,设置数据库连接字符串。
2. 创建命令对象:使用Command对象,定义需要执行的SQL命令。
3. 使用DataAdapter对象,通过其Fill()方法执行SQL命令,向数据库发送查询(或新增、修改和删除)命令,并将结果存入DataSet对象中。
4. 在DataSet对象中操作数据:使用DataAdapter对象将数据填充到DataSet对象,使用DataSet对象,可以进行数据的增删改查等操作。
// 5. 将对DataSet对象的更改提交到数据库:使用DataAdapter对象,调用其Update()方法将DataSet对象中的更改提交到数据库。
6. 关闭连接对象:使用Connection对象,调用其Close()方法来关闭与数据库的连接。
SqlConnection对象
SqlConnection类用于和要交互的SQL Server数据库建立连接。
⑴ 连接字符串
创建SqlConnection对象时,需要提供连接字符串。连接字符串是用分号(;)分隔的一系列名称/值对的选项。这些选项的顺序、大小写并不重要,组合后它们提供了创建连接所需的基本信息。
SQL Server 数据库连接常用的参数
①连接到本地默认实例
string connectionString="Data Sourse="服务器名"; Initial Catalog= "数据库名"; Integrated Security=true";
代码实例(连接式数据访问模式):
using System;
using System.Data.SqlClient; // 引入System.Data.SqlClient命名空间
namespace Csharp_学习
{
class Program
{
static void Main(string[] args)
{
// 定义连接字符串
string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=BookStore;Integrated Security=True";
// 创建SqlConnection对象,用于连接数据库
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
// 打开数据库连接
connection.Open();
Console.WriteLine("hahah222");
// 定义SQL语句
string sql = "SELECT * FROM Users";
// 创建SqlCommand对象,用于执行SQL语句
using (SqlCommand command = new SqlCommand(sql, connection))
{
// 执行SQL语句,返回SqlDataReader对象
using (SqlDataReader reader = command.ExecuteReader())
{
// 遍历SqlDataReader对象,输出查询结果
while (reader.Read())
{
Console.WriteLine("UserId: {0}, Username: {1}, City: {2}", reader["UserId"], reader["Username"], reader["City"]);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
// 暂停程序,等待用户输入
Console.ReadKey();
}
}
}
运行结果:
注:
1.采用try...catch...finally
语句块 确保在finally中关闭任何已打开的连接
在ADO.NET中,数据库访问操作可能会出现异常,如数据库连接失败、查询语句出错等,如果这些异常没有被捕获,会导致程序崩溃或者不稳定。为了防止这种情况的发生,通常将数据库访问语句放在try-catch语句块中。
当发生异常时,程序会跳转到catch块中,可以在该块中处理异常,比如输出错误信息、记录日志或者进行其他操作。这样可以保证程序的稳定性和安全性,同时也可以更好地调试和定位问题。
2.使用using
语句块,无论块是如何退出的,using
子句都会确保关闭数据库连接
使用using语句可以帮助我们自动释放资源,包括关闭数据库连接。当using块执行完毕时,会自动调用Dispose()方法释放数据库连接,无需手动关闭连接,从而避免了资源泄漏和连接池溢出等问题。当然,使用using 语句也可以使得代码更加简洁明了,易于修改。
SqlCommand 对象
用于执行SQL命令的对象,它封装了执行SQL命令所需的所有信息,包括SQL语句、参数、连接字符串等。使用SqlCommand对象可以执行多种类型的SQL命令,如查询、插入、更新、删除等。
SqlCommand 对象中常用的 属性,方法:
1. 属性
CommandText: 获取或设置SQL语句或存储过程的名称,用于执行SQL命令。
CommandType: 获取或设置SQL命令的类型,可以是SQL语句或存储过程。
Connection: 获取或设置数据库连接对象,用于执行SQL命令。
Parameters: 获取或设置命令参数的集合,用于执行参数化查询。
Transaction: 获取或设置事务对象,用于实现事务控制。
Timeout: 获取或设置命令执行的超时时间,单位为秒。
2. 方法
ExecuteNonQuery():执行SQL命令并返回受影响的行数,用于执行非查询SQL命令,如插入、更新、删除等操作。
ExecuteScalar():执行SQL命令并返回结果集中的第一行第一列的值,用于执行单值查询,如COUNT、SUM等聚合函数操作。
-ExecuteReader():执行SQL命令并返回一个SqlDataReader对象,用于执行查询操作。需要注意的是,在使用完SqlDataReader对象后,必须显式地关闭该对象及相关的资源,否则会造成资源泄漏。
BeginExecuteNonQuery():开始异步执行SQL命令,返回一个IAsyncResult对象,用于异步执行非查询SQL命令,如插入、更新、删除等操作。
BeginExecuteReader():开始异步执行SQL命令,返回一个IAsyncResult对象,用于异步执行查询操作。
Cancel():取消正在执行的SQL命令,用于取消正在执行的异步命令。
Dispose():释放SqlCommand对象及相关的资源。
示例代码:(用以向User表添加一组新的元素)
// 向Users表中添加一名新用户
string insertQuery = "INSERT INTO Users ( Username,sex,Password,City,Birth,Phone,Email,Address,RoleID,IsValid)" +
" VALUES ( @Username,@sex,@Password,@City,@Birth,@Phone,@Email,@Address,@RoleID,@IsValid)";
SqlCommand insertCommand = new SqlCommand(insertQuery, connection);
//insertCommand.Parameters.AddWithValue("@UserId", 2051);
insertCommand.Parameters.AddWithValue("@Username", "新用户");
insertCommand.Parameters.AddWithValue("@Password", "123");
insertCommand.Parameters.AddWithValue("@sex", "男");
insertCommand.Parameters.AddWithValue("@City", "成都");
insertCommand.Parameters.AddWithValue("@Birth", "1999/3/23 0:00:00");
insertCommand.Parameters.AddWithValue("@Phone", "18011111122");
insertCommand.Parameters.AddWithValue("@Email", "5222122@qq.com");
insertCommand.Parameters.AddWithValue("@Address", "成都都江堰");
insertCommand.Parameters.AddWithValue("@RoleID", 3);
insertCommand.Parameters.AddWithValue("@IsValid", true);
int rowsInserted = insertCommand.ExecuteNonQuery();
if (rowsInserted > 0)
{
Console.WriteLine("New user added successfully.");
}
else
{
Console.WriteLine("Failed to add new user.");
}
运行结果: