ADO.NET的整理
ADO.NET的几个对象
- Connection:管理数据库的连接
- Command:对数据库执行命令
- DataReader:数据流读取器,返回的数据都是快速的且只是“向前”的数据流。无法实例化,只能通过Command创建
- DateSet:缓存数据,对数据进行操作
- DataAdapter:数据适配器,数据库和DataSet的桥梁
ADO.NET命名空间
注:图取自网络
常见的是SQL数据源
引用命名空间:
using System.Data.SqlClient;
一、Connection类
连接数据库,Connection会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。
Connection有两个重要属性:ConnectionString和State,连接字符串和连接状态
两个重要方法:Open()和Close(),用来打开和关闭数据库连接
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { conn.Open(); }
conn.State.ToString():当前连接状态,返回值为Closed 或Open
二、Command对象
Command有两个重要属性:CommandType, 指明CommandText 是SQL语句,存储过程还是表操作,默认值为CommandType.Text;
两个值:(1)CommandType.StoredProcedure,以存储过程方式执行
(2)CommandType.Text SQL语句执行
(3)CommandType.TableDirect,直接处理某个表
CommandText,值为SQL语句或是存储过程名称,默认为SQL语句
创建命令对象的两种方式
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { conn.Open(); SqlCommand SqlCommand= conn .CreateCommand(); //这种方式比较好
SqlCommand.CommandText="select * from Student"; //或是实例化一个对象 //SqlCommand sqlcmd=new SqlCommand(); //sqlcmd.CommandText ="select * from student"; //sqlcmd.Connection=conn;
}
三个重要方法:
- ExecuteReader():返回DataReader对象,DataReader对象说明详见下文
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { SqlCommand command = conn.CreateCommand(); command.CommandText = "Select * form Student";
//CommandBehavior.CloseConnetion 关闭dataReader时,同时也把与它相关联的Connection连接也一起关闭 using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection)) { while (dr.Read()) { //开始读取数据了,接下来你想怎么样就怎么样了 string str = dr.GetSqlString(0).ToString(); } } }
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { SqlConnection conn = new SqlConnection(str); //创建连接 SqlCommand cmd = conn.CreateCommand(); //创建命令 cmd.CommandText = "SELECT * FROM Person"; //设置操作语句 conn.Open(); //打开连接 //SqlDataReader读取数据 using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader[0] + ":" + reader[1]); //输出当前行的第一列,第二列数据 } } cmd.CommandText = "SELECT Count(*) FROM Person"; object obj = cmd.ExecuteScalar(); //仅查询第一行第一列 Console.WriteLine((int)obj); conn.Close(); //关闭连接 }
- ExecuteScalar():返回数据第一行第一列的值,如Count(*),如果没有数据,则返回NULL
- ExecuteNonQuery():返回增、删、改的影响行数
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { SqlCommand cmd = conn.CreateCommand(); //创建命令 cmd.CommandText = "Update Person Set PersonName = 'Ado.net修改' WHERE PersonId = @Id"; //设置操作语句 cmd.Parameters.Add("@Id", SqlDbType.Int); //添加参数,说明类型 cmd.Parameters["@Id"].Value = 1; //设置参数值 conn.Open(); //打开连接 int i = cmd.ExecuteNonQuery(); //执行命令,ExecuteNonQuery由名称看出,只能用于非查询语句 conn.Close(); //关闭连接 Console.WriteLine(i); //输出影响行数
//直接使用参数集合添加你需要的参数,推荐这种写法
//SqlParameter[] parameters = new SqlParameter[]
//{
//new SqlParameter("@name",SqlDbType.NVarChar,100){Value = "yang"},
//new SqlParameter("@age",SqlDbType.Int,2){Value = 888},
//new SqlParameter("@address",SqlDbType.NVarChar,20){Value = "Jiang Su"},
//};
//ommand.Parameters.AddRange(parameters);
}
三、DataReader类
常见方法:
(1)Read()返回Bool,是否还有下一行,并移到结果集的下一行
(2)GetOrdinal(string 列名),返回序列号,通过列名来获取当前列的索引号,这样如果下次你列名顺序发生变化也没有关系
(3)GetName(int 序列号): 获取列名,参数为指定列名的序列号,返回string
int nameId= dr.GetOrdinal("name"); string columnName = dr.GetName(nameId);
//知道列名获取值
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(sdr.GetOrdinal("name")));
}
}
(4)NextResult(),当查询为批处理查询时,使用这个方法去读取下一个结果集,返回值为Bool,如果存在多个结果集,则为 true;否则为 false
using (SqlConnection conn = new SqlConnection(strConnString))
{ conn.Open(); using (SqlCommand cmd = new SqlCommand())
{ cmd.Connection = conn; // 利用分号「;」串连多句 SQL 语句,之后再一次丢进数据库去执行,达成「批次」读取或更新 // 数据库的目的。此技巧亦适用于 INSERT、UPDATE、DELETE 的「批次」执行。 cmd.CommandText = "SELECT 字段1,字段2 FROM 数据表1 ; SELECT * FROM 数据表2"; using (SqlDataReader dr = cmd.ExecuteReader())
{ while(dr.Read())
{ this.DropDownList1.Items.Add(dr.GetSqlString(0).ToString() + dr.GetSqlInt32(1).ToString()); } dr.NextResult(); while(dr.Read())
{ this.DropDownList2.Items.Add(dr.GetString(0) + dr.GetInt32(1)); } } } }
四、SqlDataAdapter 数据适配器
有四个重载
无参
SqlDataAdapter(SqlCommand) // 执行命令对象实例
SqlDataAdapter(String, SqlConnection) //只能指定查询语句 ②连接对象实例
SqlDataAdapter(String, ConnectionString)// 用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的一个新实例
一个重要方法:Fill(),数据填充至DataSet
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { DataSet dataSet = new DataSet(); conn.Open(); SqlCommand command = conn.CreateCommand(); command.CommandText = "select name,age,address from MyInformation"; SqlDataAdapter dataAdapter = new SqlDataAdapter(command); dataAdapter.Fill(dataSet); //填充数据 }
对数据进行增加操作
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { using (SqlConnection conn = new SqlConnection(ConnectionString())) { conn.Open(); //构建查询语句,也可以指定SqlCommand,其中变换的方法有很多 SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn); DataSet ds = new DataSet(); da.Fill(ds); //这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库 SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); //添加行,实例化一个行对象,注意是用NewRow来创建行 DataRow row = ds.Tables[0].NewRow(); row[0] = "Yang"; row[1] = "鬼头"; ds.Tables[0].Rows.Add(row); //添加到表中 da.Update(ds); //把DataSet中表和数据库进行对比,更新 } }
更新操作
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { using (SqlConnection conn = new SqlConnection("")) { SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn); DataSet ds = new DataSet(); da.Fill(ds); //很重要的一句话 SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); ds.Tables[0].Rows[12][1] = ""; //修改数据 da.Update(ds); //调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据 //如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常 ds.AcceptChanges(); //这句话可以不写的 } }
最后
对于一些增删改,都应加上事务,防止出错能回滚数据
using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind")) { //事务 SqlTransaction myTran = con.BeginTransaction(); tyr { //正常代码执行 ..............
//提交事务 myTran.Commit(); } catch(Exception e) { //出错,事务回滚 myTran.Rollback(); } }