• ADO.NET入门


    什么是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;
            }
        }

    下载DEMO

  • 相关阅读:
    vm扩容
    手算二维离散傅里叶变换
    取消vim模式匹配的高亮
    DS DI ES SI等等
    int and Integer
    为什么超类能引用子类的对象
    voltile解析
    java集合
    疑问:无限定通配符
    layui table 导出
  • 原文地址:https://www.cnblogs.com/vin-c/p/4095965.html
Copyright © 2020-2023  润新知