什么是ADO.NET
ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSql Server一致。
ADO.NET中的五个主要对象
一、Connection
Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。Close和Dispose的区别,Close以后还可以Open,Dispose以后则不能再用。
二、Command
Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。
三、DataAdapter
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。
四、DataSet
DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
五、DataReader
DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。
总结
ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。
一些栗子:
ADO.NET入门——ExecuteNonQuery
class Program { static void Main(string[] args) { //链接字符串 const string conStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; //连接通道 SqlConnection conn = new SqlConnection(conStr); //打开链接 conn.Open(); //命令对象 SqlCommand comm = new SqlCommand(); //指定链接通道 comm.Connection = conn; //即将执行的sql命令 comm.CommandText = "update Students set StudentName=StudentName"; //提交命令到数据库 //ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数, //适合:insert、delete、update(对于其他语句返回-1) int result = comm.ExecuteNonQuery(); //关闭链接 conn.Close(); Console.WriteLine("({0} 行受影响)",result); Console.ReadKey(); } }
ADO.NET入门——ExecuteScalar
class Program { static void Main(string[] args) { //链接字符串 const string conStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; //连接通道 SqlConnection conn = new SqlConnection(conStr); //打开链接 conn.Open(); //命令对象 SqlCommand comm = new SqlCommand(); //指定链接通道 comm.Connection = conn; //即将执行的sql命令 comm.CommandText = "select count(*) from Students"; //提交命令到数据库 //ExecuteScalar() 执行查询,返回结果集的首行首列 object result = comm.ExecuteScalar(); //关闭链接 conn.Close(); Console.WriteLine("总共有{0}条数据", result); Console.ReadKey(); } }
ADO.NET入门——ExecuteReader
public partial class Form1 : Form { const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; public Form1() { InitializeComponent(); } /// <summary> /// 使用ExecuteReader读取一行数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOnce_Click(object sender, EventArgs e) { SqlDataReader dr = ExecuteReader("select top 1 * from Students"); Student student = ConvertSqlDataReaderToStudent(dr); //为了让数据能够在DataGridView里显示, List<Student> list = new List<Student>() { student }; dgvStudentList.DataSource = list; } /// <summary> /// 使用ExecuteReader读取多行行数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnMore_Click(object sender, EventArgs e) { SqlDataReader dr = ExecuteReader("select * from Students"); List<Student> list = ConvertSqlDataReaderToStudents(dr); dgvStudentList.DataSource = list; } /// <summary> /// 获取 SqlDataReader /// </summary> /// <param name="cmdText"></param> /// <returns></returns> private SqlDataReader ExecuteReader(string cmdText) { //连接通道 SqlConnection conn = new SqlConnection(ConStr); //打开链接 if (conn.State != ConnectionState.Open) conn.Open(); //命令对象 SqlCommand comm = new SqlCommand(); //指定链接通道 comm.Connection = conn; //即将执行的sql命令 comm.CommandText = cmdText; //提交命令到数据库 //ExecuteReader(CommandBehavior.CloseConnection), //在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭 SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection); return dr; } /// <summary> /// 将 SqlDataReader 对象转换为 Student对象 /// </summary> /// <param name="dr"></param> /// <returns></returns> private Student ConvertSqlDataReaderToStudent(SqlDataReader dr) { if (!dr.Read()) return null; Student student = new Student { StudentId = (int)dr["StudentId"], StudentName = dr["StudentName"].ToString(), StudentGender = (bool)dr["StudentGender"], StudentAge = (int)dr["StudentAge"], GradeId = (int)dr["GradeId"] }; return student; } /// <summary> /// 将 SqlDataReader 对象转换为 Student列表 /// </summary> /// <param name="dr"></param> /// <returns></returns> private List<Student> ConvertSqlDataReaderToStudents(SqlDataReader dr) { List<Student> list = new List<Student>(); while (dr.Read()) { Student student = new Student { StudentId = (int)dr["StudentId"], StudentName = dr["StudentName"].ToString(), StudentGender = (bool)dr["StudentGender"], StudentAge = (int)dr["StudentAge"], GradeId = (int)dr["GradeId"] }; list.Add(student); } return list; } } /// <summary> /// 学生实体类 /// </summary> public class Student { #region Model /// <summary> /// 主键 /// </summary> public int StudentId { get; set; } /// <summary> /// 姓名 /// </summary> public string StudentName { get; set; } /// <summary> /// 性别 true:男; false:女 /// </summary> public bool StudentGender { get; set; } /// <summary> /// 年龄 /// </summary> public int StudentAge { get; set; } /// <summary> /// 所属班级主键 /// </summary> public int GradeId { get; set; } #endregion Model }
ADO.NET入门——DataAdapter
public partial class Form1 : Form { const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { DataTable dt = ExecuteDataTable("select * from Students"); dgvStudentList.DataSource = dt; } /// <summary> /// 获取 DataTable /// </summary> /// <param name="cmdText"></param> /// <returns></returns> private DataTable ExecuteDataTable(string cmdText) { //实例化一个 SqlDataAdapter SqlDataAdapter da = new SqlDataAdapter(cmdText, ConStr); //实例化一个 DataTable DataTable dt = new DataTable(); //将数据填充到 dt da.Fill(dt); return dt; } }
ADO.NET入门——Parameters
public partial class Form1 : Form { const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; public Form1() { InitializeComponent(); } /// <summary> /// 绑定数据到 datagridview /// </summary> private void BindData() { //查询语句 string sql = "select * from Students"; //标记是否有 where关键字 bool hasWhere = false; List<SqlParameter> parameters=new List<SqlParameter>(); if (txtName.Text.Trim()!="") { sql += " where StudentName like @name"; hasWhere = true; parameters.Add(new SqlParameter("name", string.Format("%{0}%", txtName.Text.Trim()))); } if (nudAge.Text.Trim()!="") { if (!hasWhere) { sql += " where StudentAge = @age"; } else { sql += " and StudentAge = @age"; } parameters.Add(new SqlParameter("age", nudAge.Text.Trim())); } DataTable dt = ExecuteDataTable(sql, parameters.ToArray()); dgvStudentList.DataSource = dt; } /// <summary> /// 获取 DataTable /// </summary> /// <param name="cmdText"></param> /// <param name="parameters">qlParameters 对象</param> /// <returns></returns> private DataTable ExecuteDataTable(string cmdText,params SqlParameter[] parameters) { //实例化一个 SqlDataAdapter SqlDataAdapter da = new SqlDataAdapter(cmdText, ConStr); //设置参数 da.SelectCommand.Parameters.AddRange(parameters); //实例化一个 DataTable DataTable dt = new DataTable(); //将数据填充到 dt da.Fill(dt); return dt; } private void btnParameters_Click(object sender, EventArgs e) { BindData(); } }
ADO.NET入门——Transaction
public partial class Form1 : Form { const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; public Form1() { InitializeComponent(); } private void btnSubmit_Click(object sender, EventArgs e) { using (SqlConnection conn=new SqlConnection(ConStr)) { conn.Open(); //开启事务 SqlTransaction transaction = conn.BeginTransaction(); try { string sql = "update Banks set Money+=1000 where id=3"; //用SqlTransaction初始化SqlCommand SqlCommand comm = new SqlCommand(sql, conn,transaction); comm.ExecuteNonQuery(); sql = "update Banks set Money-=1000 where id=2"; comm.CommandText = sql; comm.ExecuteNonQuery(); transaction.Commit(); MessageBox.Show("转账成功"); } catch (Exception ex) { transaction.Rollback(); MessageBox.Show("转账失败 " + ex.Message); } } } }
ADO.NET入门——StoredProcedure
public partial class Form1 : Form { const string ConStr = "Data Source=.;Initial Catalog=ADO_NET_Simple;Integrated Security=True"; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void btnNoParameter_Click(object sender, EventArgs e) { SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr); //用存储过程来解释命令字符串 da.SelectCommand.CommandType = CommandType.StoredProcedure; DataTable dt = new DataTable(); da.Fill(dt); dgvStudents.DataSource = dt; lblOutPut.Text = ""; lblResult.Text = ""; } private void btnInput_Click(object sender, EventArgs e) { SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr); //用存储过程来解释命令字符串 da.SelectCommand.CommandType = CommandType.StoredProcedure; //设置参数,和参数化查询一致 da.SelectCommand.Parameters.Add(new SqlParameter("name", "周")); DataTable dt = new DataTable(); da.Fill(dt); dgvStudents.DataSource = dt; lblOutPut.Text = ""; lblResult.Text = ""; } private void btnOutPut_Click(object sender, EventArgs e) { SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr); //用存储过程来解释命令字符串 da.SelectCommand.CommandType = CommandType.StoredProcedure; //设置参数,和参数化查询一致 da.SelectCommand.Parameters.Add(new SqlParameter("name", "周")); da.SelectCommand.Parameters.Add(new SqlParameter("sumAge",SqlDbType.Int)); //指定参数是输出参数 da.SelectCommand.Parameters["sumAge"].Direction = ParameterDirection.Output; DataTable dt = new DataTable(); da.Fill(dt); dgvStudents.DataSource = dt; //获取输出参数 object outPut = da.SelectCommand.Parameters["sumAge"].Value; lblOutPut.Text = "输出参数是:" + outPut; lblResult.Text = ""; } private void btnResult_Click(object sender, EventArgs e) { SqlDataAdapter da = new SqlDataAdapter("usp_selectStudents", ConStr); //用存储过程来解释命令字符串 da.SelectCommand.CommandType = CommandType.StoredProcedure; //设置参数,和参数化查询一致 da.SelectCommand.Parameters.Add(new SqlParameter("name", "周")); da.SelectCommand.Parameters.Add(new SqlParameter("sumAge", SqlDbType.Int)); da.SelectCommand.Parameters.Add(new SqlParameter("count", SqlDbType.Int)); //指定参数是输出参数 da.SelectCommand.Parameters["sumAge"].Direction = ParameterDirection.Output; //指定参数是返回值参数 da.SelectCommand.Parameters["count"].Direction = ParameterDirection.ReturnValue; DataTable dt = new DataTable(); da.Fill(dt); dgvStudents.DataSource = dt; //获取输出参数 object outPut = da.SelectCommand.Parameters["sumAge"].Value; //获取返回值参数 object result = da.SelectCommand.Parameters["count"].Value; lblOutPut.Text = "输出参数是:" + outPut; lblResult.Text = "返回值是是:" + result; } }