ADO.NET 数据库访问

                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.");
               }

         运行结果:

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值