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