美文网首页
ADO.NET二刷

ADO.NET二刷

作者: 山猪打不过家猪 | 来源:发表于2022-11-02 18:04 被阅读0次

1.基本连接

Ado.net默认是启用连接池的

  • App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name ="connStr" connectionString ="Server=127.0.0.1;Database=SMDB;Uid=sa;pwd=shangxi"/>
    </connectionStrings>
</configuration>    
  • Program.cs这种连接不安全,所以使用上下文管理器
static void Main(string[] args)
{
    //1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
    string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
    //2.创建连接
    SqlConnection conn = new SqlConnection(connStr);
    //3.打开连接
    conn.Open();
    //4.关闭连接
    conn.Close();
}
  • Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;


namespace ado2
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {
                //2.创建连接,上下文管理器,自动回收
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    //3.打开连接
                    conn.Open();
                }
            }
            catch (SqlException ex)
            {
                throw;
            }
        }
    }
}

  • 注意:使用ConfigurationManager需要添加引用

2.常用对象

2.1 SqlCommand对象

SqlCommand是执行数据库命令的对象

重要属性
  • Connection:是SqlCommand对象使用的链接对象
  • CommandText:获取或者设置执行的T-sql语句
  • CommandType:CommandType.Text表示执行的是一个T-sql语句;CommandType.StoreProcedure,是存储过程
  • Parameters:SqlCommand对象的参数命令集合,默认是空集合
  • Transcation:获取或设置要执行的事务
创建SqlCommand对象

一般使用这种方式

        static void Main(string[] args)
        {
            //1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {
                //2.创建连接,上下文管理器,自动回收
                using (SqlConnection conn = new SqlConnection(connStr))
                {
      
                    string sql = "delete * from ScoreList where id=1";
                    //3.创建执行命令的SqlCommand对象
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //4.默认是关闭的,所以在这里打开
                    conn.Open();
                    //5.执行,增删改
                    cmd.ExecuteNonQuery();
                }
            }
            catch (SqlException ex)
            {
                throw;
            }
        }

  • 方法二:了解
        static void Main(string[] args)
        {
            //1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {
                //2.创建连接,上下文管理器,自动回收
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    //3.实例化SqlCommand是执行数据库命令的对象!
                    SqlCommand cmd = new SqlCommand();
                    //4.连接数据库
                    cmd.Connection = conn;
                    string sql = "select * from ScoreList";
                    //5.执行sql语句
                    cmd.CommandText = sql;
                    //cmd.CommandText = CommandType.Text; 如果执行sql不用设置;
                    //6.执行操作
                    cmd.ExecuteNonQuery();
                }   
            }
            catch (SqlException ex)
            {

                throw;
            }

        }

注意:conn默认是关闭状态,所以每次使用using的时候需要打开conn.Open()

2.2 ExecuteNonQuery()执行插入,更新,删除
  • 返回的是受影响的行数
string sql = "delete * from ScoreList where Id=1";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
//返回受影响的行数:主要是插入,更新,删除
int count = cmd.ExecuteNonQuery();
2.3 ExecuteScalar()执行查询

返回第一行,第一列的对像

        static void Main(string[] args)
        {
            object obj1 = null;
            //1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {
                //2.创建连接,上下文管理器,自动回收
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    string sql = "select count(1) from ScoreList";
                    SqlCommand cmd = new SqlCommand(sql,conn);
                    
                    conn.Open();
                    //3.执行查询
                    obj1 = cmd.ExecuteScalar();
                }
                if (obj1 !=null)
                {
                    Console.WriteLine(Convert.ToInt32(obj1));
                }
                Console.ReadKey();
            }
            catch (SqlException ex)
            {
                throw;
            }
        }
2.4 ExecuteReader()执行查询

返回一个SqlDataReader对象结果集,这个对象用于查询少量数据,实时读取,类似于游标和指针,读取方式固定,只能前进不能后退的数据流

//1.获取连接字符串,注意这里的connStr要和配置里面的name一致!
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
try
{
    //2.创建连接,上下文管理器,自动回收
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        string sql = "select count(1) from ScoreList";
        SqlCommand cmd = new SqlCommand(sql, conn);
        //读取对象的时候必须是连接是Open,所以
        conn.Open();
        //3.执行查询
        objReader = cmd.ExecuteReader();
            if (objReader != null)
          {
        //处理数据
        while (objReader.Read())
        {
            //获取查询的数据
        }
    }
    Console.ReadKey();
    }
}
catch (SqlException ex)
{
    throw;
}

注意:可以看出来,这个查询操作的时候,必须保持conn是打开的,所以在后 面的学习中,不能用using所以对于很大的数据查询,他会一直占用数据库,所以比较适合少量查询

2.2 SqlParamter对象
添加单个参数
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
    string sql = "select * from Books where Id =@Id";
    SqlCommand cmd = new SqlCommand(sql, conn);
    //添加单个参数
    cmd.Parameters.AddWithValue("@Id", 1);
}
  • 添加多个参数
using (SqlConnection conn = new SqlConnection(connStr))
{
    string sql = "select * from Books where Id =@Id and bookName=@bookName";
    SqlCommand cmd = new SqlCommand(sql, conn);
    //添加多个参数
    SqlParameter[] pars = {
                    new SqlParameter("@Id",1),
                    new SqlParameter("@bookName","fxx"),
                };
    cmd.Parameters.AddRange(pars);
}
2.3 DataTable,DataSet

DataSet是数据在内存中的缓存,DataTable是内存中的一个表,一般作为DataSet的成员使用,结合DataAdapter使用,①DataAdapter将数据填充到DataSet中②DataAdapter将DataSet中更改提交到数据库③XML文档或者文本加载到DataSet中。
DataSet将数据加载到内存中执行,提高了数据的访问速度,提高硬盘数据的安全性,不依赖任何数据库

2.4 SqlDataAdapter

SqlDataAdapter是DataSet和SQLServer之间的桥接器,
使用Fill()方法将数据填充到DataSet里。

查询
  • 单一结果集,直接填充DataTable
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
    string sql = "select * from Books";
    //1.创建adpater
    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    //2.创建table,用于单结果集
    DataTable dt = new DataTable();
    //3.填充dt
    da.Fill(dt);
}
  • 多结果集,填充DataSet

string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
    string sql = "select * from Books;select * from Readers";
    //1.创建adpater
    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    //2.创建ds,用于多结果集
    DataSet ds = new DataSet();
    da.Fill(ds);
}

SqlHelper封装

  • SqlCommand方法(conn必须打开状态)
    ExecuteNoneQuery() 执行 增,删,改
    ExecuteScalar()返回结果集的第一行,第一列的值
    ExecuteReader() ,生成SqlDataReader
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Threading;
using System.Data.Common;

namespace SqlConsole
{
    public class SqlHelper
    {
        //链接字符串
        private static readonly string ConnStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

        /// <summary>
        /// 增,删,改
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="cmdType">1sql2存储过程</param>
        /// <param name="paras"></param>
        /// <returns>返回受影响的行数</returns>
        public static int ExecuteNoneQuery(string sql, int cmdType, params SqlParameter[] paras)
        {
            int count = 0;
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                //如果是2,执行存储过程
                if (cmdType==2)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (paras!=null && paras.Length>0)
                {
                    cmd.Parameters.AddRange(paras);
                }
                conn.Open();
                count = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                conn.Close();
            }
            return count;
        }
        /// <summary>
        /// 返回第一行,第一列的对象
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="cmdType"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static object ExecuteScalar(string sql, int cmdType, params SqlParameter[] paras)
        {
            object obj = null;
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                //如果是2,执行存储过程
                if (cmdType == 2)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (paras != null && paras.Length > 0)
                {
                    cmd.Parameters.AddRange(paras);
                }
                conn.Open();
                obj = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                conn.Close();
            }
            return obj;
        }
        /// <summary>
        /// 返回SqlDataReader
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="cmdType"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static SqlDataReader ExecuteReader(string sql, int cmdType, params SqlParameter[] paras)
        {
            SqlDataReader objReader = null;
            SqlConnection conn = new SqlConnection(ConnStr);
            SqlCommand cmd = new SqlCommand(sql, conn);
    
            if (cmdType == 2)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (paras != null && paras.Length > 0)
            {
                cmd.Parameters.AddRange(paras);
            }
            try
            {
                conn.Open();
                objReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
            }
            catch (SqlException ex)
            {
                conn.Close();
                throw new Exception("执行ExecuteReader异常",ex);
            }
           return objReader;
        }
        /// <summary>
        /// 多个结果集
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="cmdType"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql, int cmdType, params SqlParameter[] paras)
        {
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sql,conn);
                if (cmdType == 2)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (paras != null && paras.Length > 0)
                {
                    cmd.Parameters.AddRange(paras);
                }
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                conn.Open();    
                da.Fill(ds);
                conn.Close();
            }
            return ds;
        }
        /// <summary>
        /// 一个结果集
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="cmdType"></param>
        /// <param name="paras"></param>
        /// <returns></returns>
        public static DataTable GetDataTable(string sql, int cmdType, params SqlParameter[] paras)
        {
            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                if (cmdType == 2)
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (paras != null && paras.Length > 0)
                {
                    cmd.Parameters.AddRange(paras);
                }
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                conn.Open();
                da.Fill(dt);
                conn.Close();
            }
            return dt;
        }

        /// <summary>
        /// 增 删 改 事务——一系列的Sql语句
        /// </summary>
        /// <param name="listSql"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static bool ExecuteTrans(List<string> listSql)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlTransaction trans = conn.BeginTransaction();
                SqlCommand cmd = conn.CreateCommand();
                cmd.Transaction = trans;
                try
                {
                    for (int i = 0; i < listSql.Count; i++)
                    {
                        cmd.CommandText = listSql[i];
                        cmd.ExecuteNonQuery();
                    }
                    trans.Commit();//全部成功,提交
                    return true;
                }
                catch (SqlException ex)
                {
                    trans.Rollback();//回滚
                    throw new Exception("执行事务出错", ex);
                }
                
            }
        }
        //带参数的事务(待补充)

    }
}

相关文章

  • ADO.NET二刷

    1.基本连接 Ado.net默认是启用连接池的 App.config Program.cs这种连接不安全,所以使用...

  • EF框架

    什么是Entity Framework ADO.NET Entiry Framework是微软以ado.net为基...

  • 登录用户验证功能设计

    连接技术 数据库访问技术:ADO.NET ADO.NET操作数据库结构图 ADO.NET提供的四个核心对象 ADO...

  • VS2015 + EF6连接MYSQL

    ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/...

  • 简单使用 Entity Framework Code First

    .ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O...

  • ADO.NET入门

    ADO.NET ADO.NET是用于数据的访问的组件 Connection对象 用于建立数据源与应用程序之间的连接...

  • 11.9c#总结

    9号 ADO.NET数据库 从三个方面学习数据库,掌握ADO.NET 的功能和组成,掌握使用 Connection...

  • C# WinForm实践开发教程——第 四 章 ADO.NET

    ADO.NET的优点: 互操作性 可维护性 可编程性 性能优化 可伸缩性 ADO.NET 的主要对象 Connec...

  • C#入门数据库增删改查

    在C#中ADO.NET技术提供了对数据源的访问,ADO.NET是一个类库,包含了Conection 对象、Coma...

  • 2.8

    2.8商品信息查询修改界面功能设计 1.什么是ADO.NET? ado.net提供与数据源进行交互的相关的公共方法...

网友评论

      本文标题:ADO.NET二刷

      本文链接:https://www.haomeiwen.com/subject/pbeetdtx.html