ADO.NET 数据库访问技术 以SQL Server为例详解ADO.NET 数据库访问技术 以SQL Server为例详解

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: ADO.NET 数据库访问技术 以SQL Server为例详解

1. ADO.NET概述


1.1. ADO.NET 对象模型


ADO.NET是微软数据库的范围架构,它是数据库应用程序和数据源之间沟通的一座桥梁,主要提供一个面向对象的数据访问结构,在使用C#开发应用程序时,就主要使用的是ADO.NET计算访问数据库。


0a2653c851af460fa595bd959398a8f1.png


Connection对象提供与数据库的连接功能;

Command对象用来返回数据、修改数据、运行存储过程、发送以及检索参数信息等数据库命令;

DataReader对象用于通过Command对象从数据库中检索信息;

DataAdapter对象用于连接DataSet对象和数据源,使用Command对象在数据源中执行命令,以便将数据加载到DataSet对象中,并且确保DataSet中数据的更改与数据源保持一致;

DataSet对象是ADO.NET的核心,是一个数据库容器,可以把它当做是一个存放在内存中的数据库,它支持断开式、分布式数据方案。


1.2. 数据访问命名空间


在C#中开发数据库应用程序时主要有以下命名空间


System.Data              //提供对表示ADO.NET结构的类的访问
System.Data.Common       //包含由各种.NET Framework数据提供程序共享的类
System.Data.odbc         //ODBC数据提供程序,用来访问ODBC数据源的类集合
System.Data.OleDb        //OLE DB数据提供程序,用于访问OLE DB数据源的类集合
System.Data.SqlClient    //SQL服务器数据提供程序,用于访问SQL Server数据库的类集合
System.Data.SqlTypes     //提供SQL Server中本机数据类型
System.Data.OracleClient //用于Oracle的数据提供程序,用于访问Oracle数据源的类集合


本博客主要使用System.Data.SqlClient命名空间进行编程


2. Connection数据连接对象


2.1. Connection对象


Connection对象主要用作提供与数据库的连接功能,所有对数据库的访问操作都是从建立数据库连接开始的。


它的一些属性描述了数据源和用户身份验证。

例如:连接SQL Server数据库


string connectionString="Server=服务器名;User Id=用户;Pwd=密码;DataBase=数据库名称";


连接Access 数据库


string connectionString="provide=提供者; Data Source=Access文件路径";


2.2. 应用SQLConnection对象连接数据库


调用Connection对象的Open方法或Close方法可以打开或关闭数据库连接,而且必须在设置好数据库连接字符串后才能调用Open方法,否则Connection对象不知道要与哪个数据库建立连接。


一个典型的数据库连接字符串如下所示:


// 连接SQL Server数据库,服务器名为localhost,要连接的数据库为master,user id是sa,密码是admin
String str = "Server=localhost;Database=master;User Id=sa;pwd=admin;";


有了数据库连接字符串之后就可以进行数据库连接了,如下面代码所示:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
        </div>
    </form>
</body>
// .aspx.cs文件
using System.Data.SqlClient; // 添加命名空间
protected void Page_Load(object sender, EventArgs e){
    String str = "Server=mySQLServer;Database=master;User Id=sa;pwd=admin";
    SqlConnection sqlConnection = new SqlConnection(str);
    sqlConnection.Open();
  // 若数据库连接成功则显示数据库已连接
    if (sqlConnection.State == System.Data.ConnectionState.Open)    {
        Label1.Text = "数据库已连接";
        sqlConnection.Close(); // 关闭连接
    }
    if (sqlConnection.State == System.Data.ConnectionState.Closed) {
        Label2.Text = "数据库连接已关闭";
    }
}


运行结果如下图所示,数据库连接成功,然后又关闭了连接。


2d65d23f6d4748949b924e4057485923.png


3. Command命令执行对象


3.1. Command对象


连接好数据库后要对数据库进行操作,就需要用到Command对象。


使用Connection对象与数据源建立连接后,可以使用Command对象对数据源执行查询、添加、删除和修改等各种操作,操作实现的方式可以是使用SQL语句,也可以是使用存储过程。


根据.NET Framework数据提供程序的不同,Command对象可以分成4种,分别是SqlCommand、OleDbCommand、 OdbcCommand和OracleCommand,在实际的编程过程中应该根据访问的数据源不同,选择相对应的Command对象。


Command对象常用的一些属性如下表所示:


image.png


以及Command对象的常用方法,如下表所示:


image.png


3.2. 应用Command对象操作数据


以操作SQL Server数据库为例,向数据库中添加记录时,首先要创建SqlConnection对象连接数据库,然后定义添加数据的SQL字符串,最后调用SqICommand对象的ExecuteNonQuery方法执行数据的添加操作。


例如,下面的代码用Command对象往SQL Server数据库插入一条数据(数据库和表要提取创建)


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="图书编号"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="图书名称"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" />
        </div>
    </form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
    // 创建数据库连接对象
    String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
    SqlConnection sqlConnection = new SqlConnection(connectStr);
    // 插入语句
    String insertStr = "insert into tb_bookinfo(book_code, book_name) values ('" + TextBox1.Text +"','" + TextBox2.Text +"')";
    SqlCommand sqlCommand = new SqlCommand(insertStr, sqlConnection);
    // 打开数据库连接
    sqlConnection.Open();
    // 执行插入语句
    sqlCommand.ExecuteNonQuery();
    // 关闭数据库连接
    sqlConnection.Close();
    Response.Write("添加成功"); // 如果没有发生错误则提示添加成功
}


运行结果如下图所示


6de278e6d6694ce5bb08e7e842b7e74b.png


进入SQL Server中查看数据库,有如下结果:


8ec4f2997fb246878c34ecd6d122b7c6.png


3.3. 应用Command对象调用存储过程


存储过程在数据库应用中十分常见,因此学会调用存储过程是十分有必要的


下面用一段代码详细演示如何调用存储过程,首先在SQLServer中创建存储过程

找到数据库->可编程性->存储过程->右键->新建->存储过程,输入以下代码


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE proc_AddData
  @book_code varchar(10),
  @book_name varchar(10)
AS
BEGIN
  insert into tb_bookinfo(book_code, book_name) values (@book_code, @book_name);
END
GO


如何用ASP写如下代码:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="图书编号"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="图书名称"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" />
        </div>
    </form>
</body>
// .aspx.cs 文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
    // 创建数据库连接对象
    String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
    SqlConnection sqlConnection = new SqlConnection(connectStr);
    SqlCommand sqlCommand = new SqlCommand();
    sqlCommand.Connection = sqlConnection;
    sqlCommand.CommandType = CommandType.StoredProcedure; // 指定SQLCommand要处理的对象为存储过程
    sqlCommand.CommandText = "proc_AddData"; // 指定存储过程名
    // 传入两个参数
    sqlCommand.Parameters.Add("@book_code", SqlDbType.VarChar, 10).Value = TextBox1.Text; 
    sqlCommand.Parameters.Add("@book_name", SqlDbType.VarChar, 10).Value = TextBox2.Text;
    // 打开数据库连接
    sqlConnection.Open();
    // 执行插入语句
    sqlCommand.ExecuteNonQuery();
    // 关闭数据库连接
    sqlConnection.Close();
    Response.Write("添加成功");
}

0a2653c851af460fa595bd959398a8f1.png

执行代码后,进入SQLServer查看数据库,如图所示,插入成功


2d65d23f6d4748949b924e4057485923.png


4. DataReader数据读取对象


4.1. DataReader对象概述


DataReader对象是一个简单的数据集,它主要用于从数据源中读取只读的数据集,其常用于检索大量数据。使用DataReader对象读取数据时,必须一直保持与数据库的连接,即不能用Close方法关闭数据库连接,所以也被称为连线模式。


6de278e6d6694ce5bb08e7e842b7e74b.png


DataReader对象常用的属性和方法有:


image.png


image.png


4.2. 使用DataReader对象检索数据


使用DataReader对象读取数据时,首先需要使用其HasRows属性判断是否有数据可供读取,如果有数据,返回True,否则返回False


然后再使用DataReader对象的的Read方法来循环读取数据表中的数据:最后通过访问DataReader对象的列索引来获取读取到的值,例如,sqldr[“ID”]用来 获取数据表中ID列的值。


下面的代码实现了利用SQLDataReader对象从数据库中查询记录的功能:


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="查询" OnClick="Button1_Click" />
        </div>
        <div>
            <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                <EditRowStyle BackColor="#999999" />
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#E9E7E2" />
                <SortedAscendingHeaderStyle BackColor="#506C8C" />
                <SortedDescendingCellStyle BackColor="#FFFDF8" />
                <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            </asp:GridView>
        </div>
    </form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){}
protected void Button1_Click(object sender, EventArgs e){
    // 创建数据库连接对象
    String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
    SqlConnection sqlConnection = new SqlConnection(connectStr);
  // 从tb_bookinfo表里查询book_code值为TextBox3.Text的记录
    SqlCommand sqlCommand = new SqlCommand(
        "select * from tb_bookinfo where book_code ='" + TextBox3.Text + "';", sqlConnection);
    // 打开数据库连接
    sqlConnection.Open();
    // 创建SQLDataReader对象
    SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
    GridView1.DataSource = sqlDataReader;
    GridView1.DataBind();
    // 关闭SQLDateReader对象
    sqlDataReader.Close();
    // 关闭数据库连接
    sqlConnection.Close();
    Response.Write("查询成功");
}


执行结果如下图所示:


0a2653c851af460fa595bd959398a8f1.png


5. DataSet对象和DataAdapter对象


5.1. DataSet和DataAdapter对象概述


DataSet对象


DataSet对象是ADO.NET的核心成员,它是支持ADO.NET断开式、分布式数据方案的核心对象,也是实现基于非连接的数据查询的核心组件。DataSet对象是创建在内存中的集合对象,它可以包含任意数量的数据表以及所有表的约束、索引和关系等,它实质上相当于在内存中的一个小型关系数据库,DataSet对象通常与DataAdapter对象配合使用。


一个DataSet对象包含一组DataTable对象和DataRelation对象,其中每个DataTable对象都由DataColumn(数据列对象)、DataRow(数据行对象)和Constraint(数据约束对象)集合对象组成。


DataAdapter对象

DataAdapter对象(即数据适配器)是一种用来充当DataSet对象与实际数据源之间桥梁的对象,可以说只要有DataSet对象的地方就有DataAdapter对象,它也是专门为DataSet对象服务的。


DataAdapter对 象的工作方式一般有两种:


通过Command对象执行SQL语句,从而从数据源中检索数据,并将检索到的结果集填充到DataSet对象中

把用户对DataSet对象作出的更改写入到数据源中。

DataAdapter对象常用的属性和方法有:


image.png

image.png


5.3. 填充DataSet数据集


使用DataAdapter对象填充DataSet数据集时,需要用到其Fill方法,该方法最常用的3种重载形式如下:


int Fill(DataSet dataset):添加或更新参数所指定的DataSet数据集,返回值是影响的行数。

int Fill(DataTable datatable):将数据填充到一个数据表中。

int Fill(DataSet dataset,String tableName):填充指定的DataSet数据集中的指定表。

下面代码使用了DataAdapter对象填充DataSet数据库,以获取并显示数据表中的所有记录


// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                <EditRowStyle BackColor="#999999" />
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#E9E7E2" />
                <SortedAscendingHeaderStyle BackColor="#506C8C" />
                <SortedDescendingCellStyle BackColor="#FFFDF8" />
                <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            </asp:GridView>
        </div>
    </form>
</body>
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
    // 创建数据库连接对象
    String connectStr = "Server=DEITIVOD;Database=db_LibraryMS;User Id=sa;pwd=admin";
    SqlConnection sqlConnection = new SqlConnection(connectStr);
    String selectStr = "select * from tb_bookinfo;";
    // 创建SqlDataAdapter对象
    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(selectStr, sqlConnection);
    // 创建SqlDataSet对象
    DataSet dataSet = new DataSet();
    sqlDataAdapter.Fill(dataSet);
    // 将dataSet中的数据绑定到GridView中
    GridView1.DataSource = dataSet;
    GridView1.DataBind();
}


执行效果如下所示:


0a2653c851af460fa595bd959398a8f1.png


从上面的代码中可以看出,使用DataAdapter和DataSet查询数据时,并不需要显式地打开和关闭数据库连接,这就是无连接模式优点。


5.4. DataSet对象与DataReader对象的区别


ADO.NET中提供了两个对象用于检索关系数据:DataSet对象与DataReader对象,其中DataSet对象是将用户需要的数据从数据库中复制下来,并存储在内存中,用户是对内存中的数据直接操作


而DataReader对象则像一根管道,连接到数据库上,抽取出用户需要的数据后,管道断开,所以用户在使用DataReader对象读取数据时,一定要保证数据库的连接状态是开启的,而使用DataSet对象时就没有这个必要。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
17天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
42 3
|
17天前
|
数据库 索引
深入理解数据库索引技术:回表与索引下推详解
【10月更文挑战第23天】 在数据库查询性能优化中,索引的使用是提升查询效率的关键。然而,并非所有的索引都能直接加速查询。本文将深入探讨两个重要的数据库索引技术:回表和索引下推,解释它们的概念、工作原理以及对性能的影响。
35 3
|
23天前
|
存储 NoSQL 关系型数据库
数据库技术深度解析:从基础到进阶
【10月更文挑战第17天】数据库技术深度解析:从基础到进阶
54 0
|
16天前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
102 61
|
14天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
16天前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
17天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
23 4
|
14天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
17天前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
35 2
|
20天前
|
存储 SQL NoSQL
数据库技术深度探索:从关系型到NoSQL的演变
【10月更文挑战第21天】数据库技术深度探索:从关系型到NoSQL的演变
27 1