概要
ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库,类似于PHP中的PDO
使用
连接数据库 (Connection对象)
1. 连接字符串
基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)
例如
DataSource=.;Initial Catalog=myDataBase;UserId=myUsername;Password=myPassword;
或者
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;
也可以直接在VS数据库资源管理器中获取连接字符串
2. 连接到数据库 (Connection对象)
Connection对象有两个重要属性:
(1)ConnectionString:表示用于打开 SQL Server 数据库的字符串;
(2)State:表示 Connection 的状态,有Closed和Open两种状态。
Connection对象有两个重要方法:
(1)Open()方法:指示打开数据库;
(2)Close()方法:指示关闭数据库。
string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa";
//连接数据库,使用using可自动释放资源
using (SqlConnection con = new SqlConnection(str)) {
//打开数据库
con.Open();
//关闭数据库
con.Close();
}
操作数据库(Command对象)
Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:
ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。用于完成insert,delete,update操作,类似于PDO中exec()
using (SqlConnection con = new SqlConnection(str)) {
//打开数据库
con.Open();
//string sql = "insert into Book values('三国演义','魏蜀吴的故事',3)"; //增加
//string sql = "delete from Book where BookId = 4"; //删除
string sql = "update Book set BookName = '郭德纲相声选' where BookId = 2"; //修改
SqlCommand cmd = new SqlCommand(sql, con);
//执行sql 返回受影响的行数
int rows = cmd.ExecuteNonQuery();
//关闭数据库
con.Close();
}
ExecuteScalar ()从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列
executeScalar主要用于查询单行单列的值,如聚合函数(count,max,min,agv,sum),返回object对象,如查询不到返回null
using (SqlConnection con = new SqlConnection(str)) {
//打开数据库
con.Open();
string sql = "select BookName from Book where BookId = 2";
//string sql = "select count(*) as total from Book";
SqlCommand cmd = new SqlCommand(sql, con);
object res = cmd.ExecuteScalar();
Console.WriteLine(res.ToString());
//关闭数据库
con.Close();
Console.Read();
}
ExecuteReader()
ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾
class Program
{
static void Main(string[] args)
{
List<Book> Books = new List<Book>();
string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123";
//连接数据库,使用using可自动释放资源
using (SqlConnection con = new SqlConnection(str)) {
//打开数据库
con.Open();
string sql = "select BookName,BookContent from Book";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
SqlDataReader rows = cmd.ExecuteReader();
if (rows.HasRows) {
//读取一行,同时指针向前移动
while (rows.Read())
{
//rows中返回的是object类型,需要手动转换成需要的类型
Book book = new Book(rows["BookName"].ToString(), rows["BookContent"].ToString());
Books.Add(book);
}
}
}
//关闭数据库
con.Close();
Console.Read();
}
}
}
class Book {
private string _bookName;
private string _bookContent;
public string BookName
{
get
{
return _bookName;
}
set
{
_bookName = value;
}
}
public string BookContent
{
get
{
return _bookContent;
}
set
{
_bookContent = value;
}
}
public Book(string name,string content) {
this._bookName = name;
this._bookContent = content;
}
}
SqlDataAdapter 使用 SqlDataAdapter 可以快速的查询数据库并返回表格,无需new sqlCommend ,然后通过遍历表格拿到数据,SqlDataAdapter 内部也是通过SqlCommend实现的
string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123"; DataTable dt = new DataTable(); //连接数据库,使用using可自动释放资源 using (SqlConnection con = new SqlConnection(str)) { con.Open(); string sql = "select * from Book"; using (SqlDataAdapter sda = new SqlDataAdapter(sql, str)) { //将数据填充到dt中 sda.Fill(dt); } //关闭数据库 con.Close(); } //遍历dt 获取数据 for (int i = 0; i < dt.Rows.Count; i++) { Console.WriteLine(dt.Rows[i]["BookName"]); } Console.Read(); }
防SQL注入
与PDO一样,ADO提供sql预处理功能
PDO中使用占位符的方式,ADO也一样
PDO
$sql = "DELETE FROM `books` WHERE id = :id"; //使用占位符代替用户输入的id
$sth = $mysql->prepare($sql); //绑定参数
$sth->execute(array('id'=>$id));
ADO
string str = "Data Source=DESKTOP-3HH8GF6;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=123";
//连接数据库,使用using可自动释放资源
using (SqlConnection con = new SqlConnection(str)) {
//使用占位符
string sql = "insert into Book values(@name,@content,@type)";
using (SqlCommand cmd = new SqlCommand(sql, con)) {
//绑定参数
cmd.Parameters.Add(new SqlParameter("@name", "西厢记"));
cmd.Parameters.Add(new SqlParameter("@content", "经典名著"));
cmd.Parameters.Add(new SqlParameter("@type", 3));
con.Open();
cmd.ExecuteNonQuery();
}
//关闭数据库
con.Close();
}