ADO.NET入门

什么是ADO.NET

ADO.NET就是一组类库,这组类库可让咱们经过程序的方式访问数据库,就像System.IO下的类用类操做文件同样, System.Data.这组类是用来操做数据库(不光是MSSql Server),它提供了统一的编程接口让操做其它数据库(Access、Oracle等)的方式和操做MSSql Server一致。html

ADO.NET中的五个主要对象

1、Connection

Connection:主要是开启程序和数据库之间的链接。没有利用链接对象将数据库打开,是没法从数据库中取得数据的。Close和Dispose的区别,Close之后还能够Open,Dispose之后则不能再用。git

2、Command

Command:主要能够用来对数据库发出一些指令,例如能够对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过链接到数据源。sql

3、DataAdapter

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工做,它能够透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。数据库

4、DataSet

DataSet:这个对象能够视为一个暂存区(Cache),能够把从数据库中所查询到的数据保留起来,甚至能够将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不仅是能够储存多个Table 而已,还能够透过DataAdapter对象取得一些例如主键等的数据表结构,并能够记录数据表间的关联。DataSet 对象能够说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,自己不具有和数据源沟通的能力;也就是说咱们是将DataAdapter对象当作DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow编程

5、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("转帐失败\n" + 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;
        }
    }

 

下载DEMO架构

相关文章
相关标签/搜索