在ASP.NET Web开发技术中,对于数据库的访问是通过ADO.NET驱动来完成的。就算是EntityFramework,底层仍然是通过ADO.NET来实现数据库操作的。
ADO.NET有六个核心对象,他们被封装在命名空间
System.Data、System.Data.SqlClient中。使用ADO.NET,必须引用using这两个命名空间。
SqlConnection对象:负责与数据库建立连接,例如通过对象的Open()方法发开数据库连接,Close()方法关闭数据库连接。
SQLCommand对象:负责执行SQL命令及其相关关信息。例如实例的ExecuteReader()方法获得执行命令所得结果的读取器,ExecuteNonQuery()方法负责执行增、删、改的命令,并返回受影响行数。
SqlDataReader对象:负责读取结果集中的数据。例如实例的Read()函数返回布尔值,表示是否还有下一行数据。
SqlDataAdapter对象:负责与数据库建立桥接、映射。例如实例的Fill()函数负责将执行sql命令返回的结果集填充到指定的容器中。
代码实例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*引入ADO.NET库*/
using System.Data;
using System.Data.SqlClient;
namespace ConnTest.DB
{
/*一般地,访问数据库的方法都做成公有的*/
public class SqlHelper
{
/*定义连接字符串*/
/*
* server表示服务器,赋值为.或localhost都代表本机
* integrated security赋值而true代表使用windows身份进行登录
* database赋值为要连接的数据库
*/
string source = "server=.;integrated security=true;database=MyDB";
/*初始化连接对象:这里一般不直接建立连接,连接对象耗费巨大资源,坚持"迟用早关"的原则*/
SqlConnection conn = null;
/// <summary>
/// 构造函数实例化连接对象
/// </summary>
public SqlHelper()
{
/*实例化连接对象,传入连接字符串为其构造*/
conn = new SqlConnection(source);
}
/// <summary>
/// 返回执行sql查询返回的DataTable对象
/// </summary>
/// <param name="sql">SQL命令</param>
/// <returns>DataTable对象</returns>
public DataTable Get(string sql)
{
/*连接数据库极其重要,必须要进行一定的异常处理*/
try
{
/*打开数据库连接*/
conn.Open();
/*创建命令对象,传入sql命令和连接对象进行构造*/
SqlCommand cmd = new SqlCommand(sql, conn);
/*创建桥接驱动器对象,传入命令对象进行构造*/
SqlDataAdapter adp = new SqlDataAdapter(cmd);
/*创建盛放数据的DataTable对象*/
DataTable dt = new DataTable();
/*数据填充:将读取到的数据映射到DataTable对象中*/
adp.Fill(dt);
return dt;
}
catch(Exception e)
{
throw new Exception(e.Message.ToString());
}
finally
{
/*最后必须要关闭连接*/
conn.Close();
}
}
/// <summary>
/// 返回执行sql查询的读取器
/// </summary>
/// <param name="sql">SQL命令</param>
/// <returns>读取器</returns>
public SqlDataReader GetReader(string sql)
{
/*连接数据库极其重要,必须要进行一定的异常处理*/
try
{
/*打开数据库连接*/
conn.Open();
/*创建命令对象,传入sql命令和连接对象进行构造*/
SqlCommand cmd = new SqlCommand(sql, conn);
/*返回读取器,并且读取完成后关闭连接对象*/
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
}
/// <summary>
/// 执行增删改查SQL,并返回受影响行数
/// </summary>
/// <param name="sql">SQL命令</param>
/// <returns>受影响行数</returns>
public int CUD(string sql)
{
try
{
/*打开数据库连接*/
conn.Open();
/*创建命令对象,传入sql命令和连接对象进行构造*/
SqlCommand cmd = new SqlCommand(sql, conn);
/*执行命令,返回受影响的行数*/
return cmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
finally
{
/*最后必须要关闭连接*/
conn.Close();
}
}
}
}