一、简述基础

1、连接数据库的四个条件
  • 服务器名称:计算机名称(默认实例)、计算机名称\命名实例。
  • 具体数据库:数据库名称。
  • 登录名:学习中一般采用sa即可。
  • 密码:sa账号的密码。
2、SQLServer身份验证字符串格式

        Server=服务器名称;DataBase=数据库名称;User ID=登录账号;Password=登录密码
其中User ID可以简化成UidPassword简化成Pwd
默认实例的服务器名称=计算机名称(也可以把“计算机名称”用“.”来代替
命名实例的服务器名称=计算机名称\\实例名称(右斜杠“\”在C#中必须用“\\”来转义
示例如下:

//默认实例:“计算机名”
private string connString1 = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=123456";

//默认实例:“.”
private string connString2 = "Server=.;DataBase=MISDB;Uid=sa;Pwd=123456";

//命名实例:双右斜杠\\
private string connString3 = "Server=TSSIS001\\SQLEXPRESS;DataBase=MISDB;Uid=sa;Pwd=123456";

//命名实例:使用@
private string connString4 = @"Server=TSSIS001\SQLEXPRESS;DataBase=MISDB;Uid=sa;Pwd=123456";
3、Windows身份验证字符串格式

DataSource=服务器名称;Initial Catalog=数据库名称;Inregrated Security=True
示例如下:

//使用Windows身份验证
private string connString5 = "DataSource=.; Initial Catalog=MISDB; Integrated Security=True";
4、SqlConnection连接对象

连接的四个经典步骤:

  • 引入命名空间System.Data.SqlClient 和 System.Data。
  • 定义连接字符串。
  • 创建连接对象。
  • 打开和关闭连接对象

示例如下:

public class ConnSql
{
    //连接字符串
    private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";

    public void Conn()
    {
        //[1]创建Connection对象
        SqlConnection conn = new SqlConnection(connString);
        //[2]打开连接
        conn.Open();
        if(conn.State == ConnectionState.Open)
        {
            Console.WriteLine("成功连接");
        }
        //[3]关闭连接
        conn.Close();
        if(conn.State == ConnectionState.Closed) 
        { 
            Console.WriteLine("成功关闭"); 
        }
    }
}

二、ADO.NET 增、删、改、查 操作

1、Command对象的两个属性

        作用:Command对象用于封装要执行的SQL语句,并发送给数据库;同时命令数据库执行;根据SQL语句类型区分对应的操作、调用不同方法,返回不同的结果。
        常用属性1:CommandText用来封装要执行的SQL语句。
        常用属性2:Connection用来关联连接对象SqlConnection。

2、ExecuteNonQuery()方法

        中文意思是:执行非查询。这个方法可以执行 insert、update、delete类型的SQL语句。方法返回结果是“受影响的行数”。
示例如下:

public void Insert()
{
    //连接字符串
    private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
    //[1]创建连接对象
    SqlConnection conn = new SqlConnection(connString);
    //[2]定义SQL语句
    string sql = "insert into Employee(EmployeeName, Gender,NowAddress,)values('Kiter21','男','天津')";
    //[3]创建Command对象
    SqlCommand cmd = new SqlCommand(sql, conn);
    //方式二
    //SqlCommand cmd = new SqlCommand();
    //cmd.CommandText = sql;
    //cmd.Connection = conn;
    //[4]打开连接
    conn.Open();
    //[5]执行操作
    int result = cmd.ExecuteNonQuery();
    Console.WriteLine("受影响的行数:" + result);
    //[6]关闭连接
    conn.Close();
}

修改和删除的实现如下:

public void Update()
{
    //连接字符串
    private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
    //[1]创建连接对象
    SqlConnection conn = new SqlConnection(connString);
    //[2]定义SQL语句
    string sql = "update Employee set EmployeeName='Kiter22' where EmployeeId=1011";
    //[3]创建Command对象
    SqlCommand cmd = new SqlCommand(sql, conn);
    //[4]打开连接
    conn.Open();
    //[5]执行操作
    int result = cmd.ExecuteNonQuery();
    Console.WriteLine("受影响的行数:" + result);
    //[6]关闭连接
    conn.Close();
}

public void Delete()
{
    //连接字符串
    private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
    //[1]创建连接对象
    SqlConnection conn = new SqlConnection(connString);
    //[2]定义SQL语句
    string sql = "delete from Employee where EmployeeId=1011";
    //[3]创建Command对象
    SqlCommand cmd = new SqlCommand(sql, conn);
    //[4]打开连接
    conn.Open();
    //[5]执行操作
    int result = cmd.ExecuteNonQuery();
    Console.WriteLine("受影响的行数:" + result);
    //[6]关闭连接
    conn.Close();
}
3、ExecuteScalar()方法

中文意思:执行单一结果查询。执行后返回单行、单列的查询结果。
示例如下:

public void GetSingleResult()
{
    SqlConnection conn = new SqlConnection(connString);
    string sql = "select EmployeeName from Employee where EmployeeId=1001";
    SqlCommand sqlCommand = new SqlCommand(sql, conn);
    conn.Open();
    object result = sqlCommand.ExecuteScalar();
    conn.Close();
    Console.WriteLine(result);
}

        此方法还有一个特别的地方,它可以执行一个insert、update、delete类型的SQL语句,同时返回标识列的值,使用这个方法是最好的选择。
示例如下:

public void DoInsertAndGetSingleResult()
{
    SqlConnection conn = new SqlConnection(connString);
    string sql = "insert into Employee(EmployeeName, Gender, NowAddress,)values('Kiter21','男','天津')";
    sql += ";select @@identity";
    SqlCommand sqlCommand = new SqlCommand(sql, conn);
    conn.Open();
    object result = sqlCommand.ExecuteScalar();
    conn.Close();
    Console.WriteLine(result);
}
4、ExcuteReader()方法

此方法可以返回多行多列的数据,也就是常说的数据列表。

        注意:ExcuteReader()方法返回一个DataReader对象,在没有读取完毕之前,数据库的连接对象Connection始终是Opend状态,不能关闭。

        DataReader对象提供了多个结果集的读取方法,默认第一次读取就用第一个结果集;当第一个读取完毕后,可通过NextResult()方法判断是否还有下一个结果集。
示例如下:

public void GetReaderList()
{
    SqlConnection conn = new SqlConnection(connString);
    string sql = "select EmployeeName, Gender from Employee";
    sql += ";select * from Department";
    SqlCommand cmd = new SqlCommand(sql, conn);
    conn.Open();
    SqlDataReader readData = cmd.ExecuteReader();
    while (readData.Read())
    {
        Console.WriteLine(readData["EmployeeName"].ToString()+"\t"+readData["Gender"].ToString());
    }
    if (readData.NextResult())
    {
        while (readData.Read())
        {
            Console.WriteLine(readData[0] + "\t" + readData[1]);
        }
    }
    readData.Close();
    conn.Close();
}
5、DateSet数据集的使用

        其实把DataSet可以直接理解成“内存数据库”。也就是一个DataSet中可以包含很多查询结果的数据表,并且这些数据表结果中不仅仅是数据,还包括表的结果,甚至表之间的各种关系也能查询出来。其特点如下:
        第一、可以将查询结果“一次性的”读取到客户机的内存中,然后根据需要可以提取。
        第二、可以在DataSet中去修改表的数据,然后更新到实体数据库(实际开发不建议采用)。
        第三、可以为“代码生成器这类开发工具”的编写提供数据表的结构。
        第四、作为数据展示非常方便。

DataSet是可以同时对多个结果集操作的,如下实例:

        public void getDataSet()
        {
            SqlConnection conn = new SqlConnection(connString);
            string sql = "select * from Employee";
            SqlCommand cmd = new SqlCommand(sql, conn);
            connection.Open();
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "Employee");//填充数据[第一个查询结果集]
            cmd.CommandText = "select * from Department";//封装第二查询
            adapter.Fill(ds, "Department");//填充数据[第二个查询结果集]
            conn.Close();
            DataTable dt1 = ds.Tables["Employee"];
            foreach (DataRow dr in dt1.Rows)
            {
                Console.WriteLine(dr["EmployeeName"] + "\t" + dr["Gender"]);
            }
            DataTable dt2 = ds.Tables["Department"];
            foreach (DataRow dr in dt2.Rows)
            {
                Console.WriteLine(dr["DepartmentId"]);
            }
        }

三、方法封装复用

1、App.config文件配置连接字符串

打开配置文件,在<configuration>节点中添加一个新的数据库连接字符串:

特别说明:在配置文件中,命名实例的右斜杠不能用两个,只用一个。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<connectionStrings>
		<add name="connString" connectionString="Server=TSSIS001\SQLTEST;DataBase=MISDB;Uid=sa;Pwd=153153"/>
	</connectionStrings>
</configuration>
2、App.config配置节点读取 

在项目引用中,添加System.configuration这个引用。

找到“程序集”选项卡,然后把“System.configuration”引用对勾选上,确认。


3、封装SqlHelper通用类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace HeatingControlProject
{
    //数据库通用数据访问类
    public  class SqlHelper
    {
        //读取配置文件获得连接字符串
        private static string connString =
            ConfigurationManager.ConnectionStrings["connString"].ToString();

        /// <summary>
        /// 执行非查询操作
        /// </summary>
        /// <param name="cmdText">sql语句</param>
        /// <param name="param">Sql语句参数</param>
        /// <returns></returns>
        public static int ExecuteNonQuery(string cmdText,SqlParameter[] param=null)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(cmdText, conn);
            if (param != null)
            { 
                cmd.Parameters.AddRange(param);            
            }
            try
            {
                conn.Open();
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception("ExecuteNonQuery()异常:" + ex.Message);
            }
            finally   //以上不管是否发生异常,都会执行的代码
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 返回单一结果查询
        /// </summary>
        /// <param name="cmdText">SQL语句或存储过程名称</param>
        ///    /// <param name="param">Sql语句参数</param>
        /// <returns>返回单行单列</returns>
        /// <exception cref="Exception"></exception>
        public static object ExecuteScalar(string cmdText, SqlParameter[] param = null)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(cmdText, conn);
            if (param != null)
            {
                cmd.Parameters.AddRange(param);
            }
            try
            {
                conn.Open();
                return cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
                throw new Exception("ExecuteScalar()异常:" + ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 返回只读结果集的查询
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="param">Sql语句参数</param>
        /// <returns></returns>

        public static SqlDataReader ExecuteReader(string cmdText, SqlParameter[] param = null)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(cmdText, conn);
            if (param != null)
            {
                cmd.Parameters.AddRange(param);
            }
            try
            {
                conn.Open();
                //必须添加这个枚举
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                throw new Exception("ExecuteReader()异常:" + ex.Message);
            }
        }
        /// <summary>
        /// 返回一个DataSet内存数据集的查询
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="tableName">数据表名称</param>
        /// <param name="param">Sql语句参数</param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql, string tableName = null, SqlParameter[] param = null)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (param != null)
            {
                cmd.Parameters.AddRange(param);
            }
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                if (tableName == null)
                    da.Fill(ds);
                else
                    da.Fill(ds, tableName);
                return ds;
            }
            catch (Exception ex)
            {
                throw new Exception("GetDataSet()异常:" + ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// 返回Dataset结果集带有表名称
        /// </summary>
        /// <param name="dic">[表名称][sql语句]</param>
        /// <returns></returns>
        public static DataSet GetDataSet(Dictionary<string,string> dic)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            SqlDataAdapter adapter= new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                foreach (string key in dic.Keys)
                {
                    cmd.CommandText = dic[key];
                    adapter.Fill(ds,key);
                }
                return ds;
            }
            catch (Exception ex)
            {
                throw new Exception("GetDataSet(Dictionary<string,string> dic)"+ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }

    }
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐