ADO.Net : .NET平台上唯一的数据库访问技术
一、增删改
前期准备:
1、引用程序集 .dll (默认引入了)
2、在需要访问数据库的类中通过using关键字引入命名空间
using System.Data;
using System.Data.SqlClient;
操作步骤:
1、建立连接
创建数据库连接对象
SqlConnection conn = new SqlConnection();
2、初始化连接
a.通过设置连接对象的ConnectionString属性
conn.ConnectionString = "server=.;database=test001;uid=sa;pwd=001128;";
b.通过构造方法来初始化数据库连接对象
SqlConnection conn = new SqlConnection(conStr);
3、打开连接
调用连接对象的open方法打开连接
conn.Open();
需要在finally中释放资源
连接对象(IO流)在C#中都属于非托管类资源,需要手动释放,托管对象会由垃圾回收器自动回收
在C#中提供了一种专门针对此类对象的管理方式 using
语法using(非托管类对象的创建){
使用;(一旦离开这个范围,自动释放)
}
4、创建命令对象
SqlCommand cmd = new SqlCommand();
5、初始化命令对象
a. SqlCommand cmd = new SqlCommand();
cmd.CommandText = “”;//设定命定内容
cmd.Connection = conn;//将命令对象绑到之前的连接上
b.调用命令的构造方法
String cmdText = "";
SqlCommand cmd = new SqlCommand(cmdText,conn);
6、调用命令对象
ExecuteNonQuery()方法用于增删改数据,执行不返回值的语句
ExecuteRead()方法用于查询多行多列数据
ExecuteScalar()方法用于查询单个值,返回单个值,如执行带COUNT(*)语句
1、参数化查询
2、通过字符串拼接的方式将查询参数注入到sql语句中存在严重的注入漏洞
string sql = "update Subject set Classhour=@ClassHour where SubjectName=@SubjectName";
SqlCommand cmd = new SqlCommand(sql, conn);
//写入参数
SqlParameter para1 = new SqlParameter("@ClassHour", ClassHour);
SqlParameter para2 = new SqlParameter("@SubjectName", SubjectName);
cmd.Parameters.Add(para1);
cmd.Parameters.Add(para2);
查询:
一、在线查询:(在线状态下访问结果)
通过一个SqlDataReader对象(读取器)去读取数据库服务器上的查询结果
特点:读取过程必须保证连接畅通运行状态的限制
不可靠,受数据库服务器
(优点,不占用应用服务器内存)
二、离线查询:(离线状态下访问结果)
将查询得到的结果直接返回到本地应用程序服务器,可以关闭连接的情况下访问查询结果集(推荐)
操作步骤:
1、前期准备
2、准备一个查询的命令对象
3、在应用程序中事先准备一个容器接受查询回来的结果,改容器由DataSet对象来充当
DataSet dateSet = new DataSet();//数据集对象
4、还需准备一个数据适配器对象,用来托管执行的命令,并将命令执行后得到的查询结果填充到DataSet容器中
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(cmd);//数据适配器对象
5、调用适配器对象的Fill方法执行查询并向本地数据集中填充查询结果
sqlDataAdapter.Fill(dataSet);
6、从set中取出结果并使用
DataTable ds= dataSet.Tables[0];
7、遍历结果表的每一行
foreach (DataRow row in ds.Rows)
{
Console.WriteLine(row[“SubjectName”]);
}
三、将数据库连接字符串外置到配置文件,便于后期更改,避免硬编码
每个项目都有一个App.confing的文件,对于web项目也叫Web.config,用于存放配置文件
1、App.confing配置文件中提供了一个专用的数据库连接字符串配置标签
<connectionStrings>
<add name="connString" connectionString="server=.;database=myschool;uid=sa;pwd=001128;"/>
</connectionStrings>//只能配连接字符串
读取配置文件中的信息
①、添加对System.Configuration程序集的引用
右键引用–>添加引用–>程序集–>查找System.Configuration并添加
②、引入配置文件管理类所在的namespace
using System.Configuration;
③、通过访问ConfigurationManager提供的静态属性直接去获取配置文件中的信息
String conStr = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
2、另一种配置方式 AppSettings
注意:一个配置文件中只能出现一次AppSettings,可以配置任何文件
<appSettings>
<add key="connString" value="server=.;database=myschool;uid=sa;pwd=001128;"/>
</appSettings>
读取方式:
String conStr = ConfigurationManager.AppSettings["connString"];
四、DBHelper类简化版
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace WindowsFormsApplication5
{
public class SqlHelper
{
//数据库连接
private static readonly string connString = "server=.;database=BookShopPlus;uid=sa;pwd=001128";
//增删改
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
//查询单值
public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}
}
//查询多值
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
DataSet set = new DataSet();
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(set);
return set.Tables[0];
}
}
}
}
}
简单使用
//查询单个值
int i= (int) DBhelper.ExecuteScalar("select count(*) from subject");
Console.WriteLine(i);
//增删改
int ii = (int)DBhelper.ExecuteNonQuery("delete from subject where SubjectId=20");
Console.WriteLine(ii);
//查询多条数据
DataTable dt = DBhelper.ExecuteDataTable("select * from subject");
foreach (DataRow row in dt.Rows)
{
Console.WriteLine(row["SubjectName"]);
}