ADO.NET二刷

2022-11-02  本文已影响0人  山猪打不过家猪

1.基本连接

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

<?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>    
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();
}
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;
            }
        }
    }
}

2.常用对象

2.1 SqlCommand对象

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

重要属性
创建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里。

查询
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);
}

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封装

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);
                }
                
            }
        }
        //带参数的事务(待补充)

    }
}

上一篇 下一篇

猜你喜欢

热点阅读