• ado.net常用操作


    一、ADO.NET概要

    ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库。

    二、ADO.NET的组成

    复制代码
    ①System.Data  → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping
    ②System.Data.Coummon     → 各种数据访问类的基类和接口
    ③System.Data.SqlClient   → 对Sql Server进行操作的数据访问类
      主要有:   a) SqlConnection            → 数据库连接器
                b) SqlCommand               → 数据库命名对象
                c) SqlCommandBuilder        → 生存SQL命令
                d) SqlDataReader            → 数据读取器
                e) SqlDataAdapter           → 数据适配器,填充DataSet
                f) SqlParameter             → 为存储过程定义参数
                g) SqlTransaction           → 数据库事物
    复制代码

    三、Connection连接对象

    Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。所有Connection对象的基类都是DbConnection类。 

    3.1、连接字符串

    基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)

    3.1.1、SQL Server连接字符串

    标准安全连接: 

    Data Source=.;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者

    Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;

    可信连接:

    Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;或者

    Server=myServerAddress;Database=myDatabase;Trusted_Connection=True; 

    3.1.2、Access连接字符串

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:myDatabase.mdb;User Id=admin;Password=;

    3.1.3、MySQL连接字符串

    Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;

    3.1.4、DB2连接字符串

    Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;

    3.1.5、Oracle连接字符串

    Data Source=TORCL;User Id=myUsername;Password=myPassword; 

    在VS中获得连接字符串并连接到数据库:

    工具->连接到数据库

    选择SQLServer

    继续

    如上图,填写好相关信息

    在高级中可以查看连接字符串的所有信息

    在VS中可以实现数据库管理:

    3.2、连接到数据库

    Connection对象有两个重要属性: 

    (1)ConnectionString:表示用于打开 SQL Server 数据库的字符串; 
    (2)State:表示 Connection 的状态,有Closed和Open两种状态。 

    Connection对象有两个重要方法:

    (1)Open()方法:指示打开数据库;

    (2)Close()方法:指示关闭数据库。

    复制代码
    //创建连接对象1
    using (SqlConnection conn1 = new SqlConnection("连接字符串"))    
    {        
        conn1.Open();       
    }
    复制代码

    3.3、示例

    3.3.1、创建数据库与表

    复制代码
    /**创建数据库*/
    create database MyCar;
    go
    use MyCar;
    /**创建表*/
    create table Car
    (
    Id int primary key identity(1,1),  --编号
    Title nvarchar(128) not null,  --车名
    Speed int default(0),  --车速
    Info ntext --详细
    )
    
    /**添加数据*/
    insert into Car(Title,Speed,Info)
    select 'BYD',130,'比亚迪' union
    select 'BMW',160,'宝马' union
    select 'Benz',160,'奔驰' 
    
    /**查询*/
    SELECT [Id]
          ,[Title]
          ,[Speed]
          ,[Info]
      FROM [MyCar].[dbo].[Car]
    GO
    复制代码

     3.3.2、创建窗体项目MyCar

    3.3.3、连接到数据

    创建连接对象,打开数据

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Data.SqlClient;
    
    namespace MyCar
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnConnection_Click(object sender, EventArgs e)
            {
                //创建连接对象,指定连接字符串参数
                SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
                //打开数据
                conn.Open();
                MessageBox.Show("打开成功,状态"+conn.State);
                conn.Close();
                MessageBox.Show("关闭数据库成功");
            }
        }
    }
    复制代码

    执行结果:

    四、Command对象

    Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
    Command主要有三个方法: 

    4.1、ExecuteNonQuery

    ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。用于完成insert,delete,update操作。

    复制代码
            //新增
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                 using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                     //打开连接
                    conn.Open();
                     //将执行的sql
                    String sql = "INSERT INTO Car([Title] ,[Speed] ,[Info]) VALUES('奇瑞' ,190,'国产轿车')";
                     //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql,conn);
                     //执行,返回影响行数
                    int rows=cmd.ExecuteNonQuery();
                    if (rows > 0) MessageBox.Show("新增成功!");
                }
    
                //using 相当如下代码,确保连接对象一定会关闭
                //SqlConnection conn=null;
                //try
                //{
                //    conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar");
                //}
                //finally
                //{
                //    conn.Close();
                //}
            }
    复制代码

    执行结果:

    4.1.1、拼接字符串

    复制代码
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                 using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                     //打开连接
                    conn.Open();
                     //将执行的sql
                    String sql =String.Format("INSERT INTO Car([Title] ,[Speed] ,[Info]) VALUES('{0}' ,{1},'{2}')"
                        ,txtTitle.Text,txtSpeed.Text,txtInfo.Text);
                     //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql,conn);
                     //执行,返回影响行数
                    int rows=cmd.ExecuteNonQuery();
                    if (rows > 0) MessageBox.Show("新增成功!");
                }
            }
    复制代码

    执行:

    4.1.2、参数

    如果直接拼接字符串会存在安全隐患,使用参数可以解决问题。

    复制代码
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                 using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                     //打开连接
                    conn.Open();
                     //将执行的sql
                    String sql = "INSERT INTO  Car([Title] ,[Speed] ,[Info]) VALUES(@Ttile,@Speed,@Info)";
                     //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql,conn);
                     //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
                    cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
                    cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
                     //执行,返回影响行数
                    int rows=cmd.ExecuteNonQuery();
                    if (rows > 0) MessageBox.Show("新增成功!");
                }
            }
    复制代码

    执行结果:

    4.1.3、删除

    这里的示例是insert,如果想执行delete与update代码是一样的,只是变化了SQL。

    示例:

    复制代码
            /// <summary>
            /// 删除
            /// </summary>
            private void btnDelete_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "delete from Car where Title=@Title";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
                    //执行,返回影响行数
                    int rows = cmd.ExecuteNonQuery();
                    MessageBox.Show("删除成功"+rows+"行!");
                }
            }
    复制代码

    执行结果:

    4.2、ExecuteScalar ()

    ExecuteScalar ()从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列。

    executeScalar主要用于查询单行单列的值,如聚合函数(count,max,min,agv,sum)。

     

    示例:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Data.SqlClient;
    
    namespace MyCar
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                GetCount();
            }
    
            private void btnConnection_Click(object sender, EventArgs e)
            {
                //创建连接对象,指定连接字符串参数
                SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
                //打开数据
                conn.Open();
                MessageBox.Show("打开成功,状态" + conn.State);
                conn.Close();
                MessageBox.Show("关闭数据库成功");
            }
    
            //新增
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "INSERT INTO Car(Title ,Speed ,Info) VALUES(@Ttile,@Speed,@Info)";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
                    cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
                    cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
                    //执行,返回影响行数
                    int rows = cmd.ExecuteNonQuery();
                    if (rows > 0) { MessageBox.Show("新增成功!"); GetCount(); }
                }
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            private void btnDelete_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "delete from Car where Title=@Title";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
                    //执行,返回影响行数
                    int rows = cmd.ExecuteNonQuery();
                    MessageBox.Show("删除成功" + rows + "行!");
                }
            }
    
            /// <summary>
            /// 查询单行单列的值
            /// </summary>
            private void btnScalar_Click(object sender, EventArgs e)
            {
                GetCount();
            }
    
            private void GetCount()
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "select COUNT(*) from Car";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //执行查询返回单行单列的值,Object类型
                    Object result = cmd.ExecuteScalar();
                    //显示结果到标签
                    lblCount.Text = result.ToString();
                }
            }
        }
    }
    复制代码

    运行结果:

     

    可能返回NULL值,需要对结果进行判断,如下:

    复制代码
    object my = cmd.ExecuteScalar();
    if (object.Equals(my,null))  //可以使用Equals进行Null值的判断,易读性强
      Console.WriteLine("Not Data");
    else
      Console.WriteLine("Yes"); 
    复制代码

    五、ExecuteReader获得数据

    ExecuteReader用于实现只进只读的高效数据查询。

    ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾。

    使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:

    一种是基于序号的查找

    一个是使用适当的Get方法来查找。因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,就是可能知道一列的名称而不知道其所在的位置,这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法,此方法接收一个列名并返回此列名所在的列号。

    5.1、使用ExecuteReader实现数据查询

    示例代码:

    复制代码
            //查询
            private void btnQuery_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "select Id,Title,Speed,Info from Car";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //执行查询返回结果集
                    SqlDataReader sdr = cmd.ExecuteReader();
                    //下移游标,读取一行,如果没有数据了则返回false
                    while (sdr.Read())
                    {
                        Console.WriteLine("编号:" + sdr["Id"] + ",车名:" + sdr["Title"] + ",速度:" + sdr["Speed"]);
                    }
                }
            }
    复制代码

    运行结果:

    5.2、实体类

    实体类用于封装及映射数据。

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MyCar
    {
        /// <summary>
        /// 汽车实体类
        /// </summary>
        public class Car
        {
            /// <summary>
            /// 编号
            /// </summary>
            public int Id { get; set; }
            /// <summary>
            /// 车名
            /// </summary>
            public String Title { get; set; }
            /// <summary>
            /// 速度
            /// </summary>
            public int Speed { get; set; }
            /// <summary>
            /// 详细
            /// </summary>
            public String Info { get; set; }
        }
    }
    复制代码

    5.3、DataGridView展示数据

    示例代码:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Data.SqlClient;
    
    namespace MyCar
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                GetCount();
                BindData();
    
                List<User> users = new List<User>();
    
                User tom = new User();
                tom.Name = "Tom";
                tom.Age = "18";
                users.Add(tom);
    
                User rose = new User();
                rose.Name = "Rose";
                rose.Age = "88";
                users.Add(rose);
    
                dataGridView1.DataSource = users;
            }
    
            private void btnConnection_Click(object sender, EventArgs e)
            {
                //创建连接对象,指定连接字符串参数
                SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
                //打开数据
                conn.Open();
                MessageBox.Show("打开成功,状态" + conn.State);
                conn.Close();
                MessageBox.Show("关闭数据库成功");
            }
    
            //新增
            private void btnAdd_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "INSERT INTO Car(Title ,Speed ,Info) VALUES(@Ttile,@Speed,@Info)";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
                    cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
                    cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
                    //执行,返回影响行数
                    int rows = cmd.ExecuteNonQuery();
                    if (rows > 0) { MessageBox.Show("新增成功!"); GetCount(); BindData(); }
                }
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            private void btnDelete_Click(object sender, EventArgs e)
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "delete from Car where Title=@Title";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
                    //执行,返回影响行数
                    int rows = cmd.ExecuteNonQuery();
                    MessageBox.Show("删除成功" + rows + "行!");
                }
            }
    
            /// <summary>
            /// 查询单行单列的值
            /// </summary>
            private void btnScalar_Click(object sender, EventArgs e)
            {
                GetCount();
            }
    
            private void GetCount()
            {
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "select COUNT(*) from Car";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //执行查询返回单行单列的值,Object类型
                    Object result = cmd.ExecuteScalar();
                    //显示结果到标签
                    lblCount.Text = result.ToString();
                }
            }
    
            //查询
            private void btnQuery_Click(object sender, EventArgs e)
            {
                BindData();
            }
    
            private void BindData()
            {
                //定义一个集合,用于存放汽车对象
                List<Car> cars = new List<Car>();
    
                //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    //打开连接
                    conn.Open();
                    //将执行的sql
                    String sql = "select Id,Title,Speed,Info from Car";
                    //创建命令对象,指定要执行sql语句与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //执行查询返回结果集
                    SqlDataReader sdr = cmd.ExecuteReader();
                    //下移游标,读取一行,如果没有数据了则返回false
                    while (sdr.Read())
                    {
                        //每一行记录表示一辆车,则实例化一个汽车对象
                        Car car = new Car();
                        car.Id = Convert.ToInt32(sdr["Id"]);  //取得数据库中当前行的Id转换成int类型给对象的Id属性赋值
                        car.Title = sdr["Title"] + "";
                        car.Speed = Convert.ToInt32(sdr["Speed"]);
                        car.Info = sdr["Info"] + "";
                        cars.Add(car);  //将汽车对象添加到集合中
                    }
                    //绑定数据到控件
                    dgvCar.DataSource = cars;
                    sdr.Close();  //关闭
                }
            }
        }
    }
    复制代码

    运行结果:

    5.4、删除功能

    示例代码:

    复制代码
            /// <summary>
            /// 删除
            /// </summary>
            private void btnDelete_Click(object sender, EventArgs e)
            {
                //SelectedRows选中的行,[0]行,[0]列,Value值
                int id = Convert.ToInt32(dgvCar.SelectedRows[0].Cells[0].Value);
                //创建连接对象
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    conn.Open();  //打开连接
                    string sql = "delete from Car where Id=@Id";
                    SqlCommand cmd = new SqlCommand(sql, conn);  //sql命令对象
                    cmd.Parameters.Add(new SqlParameter("@Id",id));  //指定参数
                    int rows = cmd.ExecuteNonQuery();  //执行并返回影响行数
                    MessageBox.Show("删除成功"+rows+"行!");
                    BindCar();  //重新绑定
                }
            }
    复制代码

    运行结果:

    5.5、编辑功能

    示例代码:

    FormCar.cs编辑按钮

    复制代码
            /// <summary>
            /// 编辑
            /// </summary>
            private void btnEdit_Click(object sender, EventArgs e)
            {
                //获得当前选择行的索引
                int index = dgvCar.SelectedRows[0].Index;
                //从集合中获得索引对应的汽车对象
                Car car = cars[index];
    
                FormEdit edit = new FormEdit();
                edit.car = car;
                edit.ShowDialog();  //打开模式窗口
                BindCar();  //重新绑定
            }
    复制代码

    FormEidt.cs代码:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MyCar
    {
        public partial class FormEdit : Form
        {
    
            /// <summary>
            /// 要编辑的汽车对象
            /// </summary>
            public Car car { get; set; }
    
            public FormEdit()
            {
                InitializeComponent();
            }
    
            private void FormEdit_Load(object sender, EventArgs e)
            {
                lblId.Text = car.Id+"";
                txtTitle.Text = car.Title;
                txtSpeed.Text = car.Speed+"";
                txtInfo.Text = car.Info;
            }
    
            //保存
            private void btnSave_Click(object sender, EventArgs e)
            {
                //创建连接对象
                using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
                {
                    conn.Open();  //打开连接
                    string sql = "update Car set Title=@Title,Speed=@Speed,Info=@Info where Id=@Id";
                    SqlCommand cmd = new SqlCommand(sql, conn);  //sql命令对象
                    cmd.Parameters.Add(new SqlParameter("@Id", car.Id));  //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));  //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));  //指定参数
                    cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));  //指定参数
                    int rows = cmd.ExecuteNonQuery();  //执行并返回影响行数
                    MessageBox.Show("修改成功" + rows + "行!");
                }
            }
        }
    }
    复制代码

    运行结果:

    六、综合示例

    完成一个人事管理系统(HR)中的员工(Emp)管理模块,要求实现如下功能:

    6.1、创建数据库与表

    6.1.1、创建HR数据库

    --创建数据库
    create database HR;

    结果:

    6.1.2、创建Emp员工表

    Emp员工表(编号Id、姓名Name、电话Phone、身高Height、备注Memo)

    复制代码
    --创建数据库
    create database HR;
    use HR;
    --Emp员工表(编号Id、姓名Name、电话Phone、身高Height、备注Memo)
    --创建表
    create table Emp
    (
    Id int primary key identity(100000,1),  --编号
    Name nvarchar(32) not null,  --姓名
    Phone varchar(32), --电话
    Height int, -- 身高
    Memo ntext --备注
    )
    --添加数据
    insert into Emp(Name,Phone,Height,Memo) values('李天明','13723887780',158,'单身');
    --查询
    select Id,Name,Phone,Height,Memo from Emp;
    --删除
    delete from Emp where Id=100000
    --修改
    update Emp set Name='李地明',Phone='13723887789',Height=149 where Id=100001
    复制代码

    结果:

    6.2、创建项目与实体类

    6.2.1、创建项目

    这里同样创建一个WinForms窗体项目

    6.2.2、创建实体类

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace HR.Models
    {
        /// <summary>
        /// 员工
        /// </summary>
        public class Emp
        {
            /// <summary>
            /// 编号
            /// </summary>
            public int Id { get; set; }
            /// <summary>
            /// 姓名
            /// </summary>
            public String Name { get; set; }
            /// <summary>
            /// 电话
            /// </summary>
            public String Phone { get; set; }
            /// <summary>
            /// 身高
            /// </summary>
            public int Height { get; set; }
            /// <summary>
            /// 备注
            /// </summary>
            public String Memo { get; set; }
    
        }
    }
    复制代码

    6.2.3、封装数据访问

    为了避免重复的数据访问代码,这里我们封装了一个数据库访问工具类:SqlHelper

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Data;
    using System.Linq;
    using System.Text;
    
    namespace HR.Utils
    {
        /// <summary>
        /// 用于访问SQLServer数据库的工具类
        /// </summary>
        public class SqlHelper
        {
            /// <summary>
            /// 连接字符串 write once,only once!  
            /// </summary>
            public static String connString = "server=.;uid=sa;pwd=sa;database=HR";
    
    
            /// <summary>
            /// 完成增,删,改
            /// </summary>
            /// <param name="sql">将要执行的sql</param>
            /// <param name="ps">可变参数,指定sql中的参数</param>
            /// <returns>影响行数</returns>
            public static int Execute(String sql, params SqlParameter[] ps)
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    //打开连接
                    conn.Open();
                    //创建命令对象,指定sql与连接对象conn
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    //指定参数
                    if (ps != null) cmd.Parameters.AddRange(ps);
                    //执行sql命令,返回影响行数
                    return cmd.ExecuteNonQuery();
                }
            }
    
            /// <summary>
            /// 执行查询,返回SqlDataReader,一定要关闭
            /// </summary>
            /// <param name="sql">将要执行的sql</param>
            /// <param name="ps">可变参数,指定sql中的参数</param>
            /// <returns>SqlDataReader结果集</returns>
            public static SqlDataReader Reader(String sql, params SqlParameter[] ps)
            {
                //定义一个连接对象,指定连接字符串using,sa sa MyCar .
                SqlConnection conn = new SqlConnection(connString);
                //打开数据库
                conn.Open();
                //定义命令对象,指定要执行的sql与conn连接参数
                SqlCommand cmd = new SqlCommand(sql, conn);
                //指定参数
                if (ps != null) cmd.Parameters.AddRange(ps);
                //执行SQL查询,返回结果集给sdr,关闭reader时也关闭连接
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
    
        }
    }
    复制代码

    调用办法:

    增删改:

                int rows = SqlHelper.Execute("delete from Emp where Id=@id",new SqlParameter("id",100002));
                MessageBox.Show(rows+"");

    查询:

    复制代码
                SqlDataReader sdr = SqlHelper.Reader("select * from Emp where Id=@id",new SqlParameter("id",100003));
                if (sdr.Read())
                {
                    MessageBox.Show(sdr["Name"]+"");
                }
                sdr.Close();
    复制代码

    6.3、实现展示功能

    示例代码:

    复制代码
            #region 绑定员工信息到网格
            public void BindData()
            {
                emps = new List<Emp>();
                //执行查询获得结果集
                SqlDataReader sdr = SqlHelper.Reader("select Id,Name,Phone,Height,Memo from Emp where Name like @Name",new SqlParameter("@Name",'%'+txtName.Text+"%"));
                while (sdr.Read()) 
                {
                    Emp emp = new Emp();
                    emp.Id = Convert.ToInt32(sdr["Id"]);
                    emp.Name = sdr["Name"] + "";
                    emp.Phone = sdr["Phone"] + "";
                    emp.Height = Convert.ToInt32(sdr["Height"]);
                    emp.Memo = sdr["Memo"] + "";
                    emps.Add(emp);
                }
                sdr.Close();
                dgvEmp.DataSource = emps;
            }
            #endregion
    复制代码

    运行结果:

     

    6.4、实现新增功能

    示例代码:

    按钮事件:

                FormAdd add = new FormAdd();
                add.ShowDialog();
                BindData();

    新增窗口:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using HR.Utils;
    using System.Data.SqlClient;
    
    namespace HR
    {
        public partial class FormAdd : Form
        {
            public FormAdd()
            {
                InitializeComponent();
            }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                string sql = "insert into Emp(Name,Phone,Height,Memo) values(@Name,@Phone,@Height,@Memo);";
                int rows = SqlHelper.Execute(sql,
                    new SqlParameter("@Name", txtName.Text),
                    new SqlParameter("@Phone", txtPhone.Text),
                    new SqlParameter("@Height", txtHeight.Text),
                    new SqlParameter("@Memo", txtMemo.Text));
                MessageBox.Show("新增成功"+rows+"行!");
            }
        }
    }
    复制代码

    运行结果:

    6.5、实现删除功能

    示例代码:

    复制代码
            #region 删除
            private void btnDelete_Click(object sender, EventArgs e)
            {
                int id =Convert.ToInt32(dgvEmp.SelectedRows[0].Cells[0].Value);
                int rows = SqlHelper.Execute("delete from Emp where Id=@Id",new SqlParameter("@Id",id));
                MessageBox.Show("删除成功"+rows+"行");
                BindData();
            }
            #endregion
    复制代码

    运行结果:

     

    6.6、实现编辑功能

    示例代码:

    按钮事件:

    复制代码
                //取得索引
                int index=dgvEmp.SelectedRows[0].Index;
                FormEdit edit = new FormEdit();
                edit.emp = emps[index];
                edit.ShowDialog();
                BindData(); 
    复制代码

    窗体代码:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Data.SqlClient;
    using HR.Utils;
    using HR.Models;
    
    namespace HR
    {
        public partial class FormEdit : Form
        {
            public FormEdit()
            {
                InitializeComponent();
            }
    
            public Emp emp { get; set; }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                string sql = "update Emp set Name=@Name,Phone=@Phone,Height=@Height,Memo=@Memo Where Id=@Id";
                int rows = SqlHelper.Execute(sql,
                    new SqlParameter("@Name", txtName.Text),
                    new SqlParameter("@Phone", txtPhone.Text),
                    new SqlParameter("@Height", txtHeight.Text),
                    new SqlParameter("@Memo", txtMemo.Text),
                    new SqlParameter("@Id", emp.Id));
                                
                MessageBox.Show("修改成功" + rows + "行!");
            }
    
            private void FormEdit_Load(object sender, EventArgs e)
            {
                txtHeight.Text = emp.Height + "";
                txtMemo.Text = emp.Memo;
                txtName.Text = emp.Name;
                txtPhone.Text = emp.Phone;
            }
        }
    }
    复制代码

    运行结果:

    6.7、实现搜索功能

    示例代码:

    按钮:

    复制代码
            #region 查询
            private void btnQuery_Click(object sender, EventArgs e)
            {
                BindData();
            }
            #endregion
    复制代码

    BindData()方法

    复制代码
            #region 绑定员工信息到网格
            public void BindData()
            {
                emps = new List<Emp>();
                //执行查询获得结果集
                SqlDataReader sdr = SqlHelper.Reader("select Id,Name,Phone,Height,Memo from Emp where Name like @Name",new SqlParameter("@Name",'%'+txtName.Text+"%"));
                while (sdr.Read()) 
                {
                    Emp emp = new Emp();
                    emp.Id = Convert.ToInt32(sdr["Id"]);
                    emp.Name = sdr["Name"] + "";
                    emp.Phone = sdr["Phone"] + "";
                    emp.Height = Convert.ToInt32(sdr["Height"]);
                    emp.Memo = sdr["Memo"] + "";
                    emps.Add(emp);
                }
                sdr.Close();
                dgvEmp.DataSource = emps;
            }
            #endregion
    复制代码

    运行结果:

     

    6.8、所有代码与扩展

    FormMain.cs

     View Code

    FormEmp.cs

     View Code

    FormAdd.cs

     View Code

    FormEdit.cs

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Data.SqlClient;
    using HR.Utils;
    using HR.Models;
    
    namespace HR
    {
        public partial class FormEdit : Form
        {
            public FormEdit()
            {
                InitializeComponent();
            }
    
            public Emp emp { get; set; }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                string sql = "update Emp set Name=@Name,Phone=@Phone,Height=@Height,Memo=@Memo Where Id=@Id";
                int rows = SqlHelper.Execute(sql,
                    new SqlParameter("@Name", txtName.Text),
                    new SqlParameter("@Phone", txtPhone.Text),
                    new SqlParameter("@Height", txtHeight.Text),
                    new SqlParameter("@Memo", txtMemo.Text),
                    new SqlParameter("@Id", emp.Id));
                                
                MessageBox.Show("修改成功" + rows + "行!");
            }
    
            private void FormEdit_Load(object sender, EventArgs e)
            {
                txtHeight.Text = emp.Height + "";
                txtMemo.Text = emp.Memo;
                txtName.Text = emp.Name;
                txtPhone.Text = emp.Phone;
            }
        }
    }
    复制代码

    扩展:多删除(一次选择多行删除)、多条件组合搜索、分页。

    七、作业

    7.1、大作业

    实现一个产品管理系统(GoMall),完成对产品(Product)的维护。

    1)、创建一个数据库GoMall

    2)、定义一个表产口Product(编号Id,名称Name,价格Price,详细Details),添加5个测试数据

    3)、创建一个Winform项目,名称为GoMall

    4)、完成展示功能

    5)、完成新增功能

    6)、完成删除功能

    7)、完成修改功能

    8)、扩展功能,添加一个类型表,在产品中添加类型外键;实现按名称搜索功能。

    7.2、第1次小作业

    1、使用ADO.NET实现增加,删除操作,要求3个字段以上,同时用拼接字符串与带参数的两种办法。

    2、使用ExecuteScalar实现单行单列值的查询。

    7.3、第2次小作业

    1、使用ADO.NET实现“展示”功能。

    2、使用ADO.NET实现“删除”功能。

    3、使用ADO.NET实现“编辑”功能。

    八、视频与资料下载

  • 相关阅读:
    poptest老李谈动态口令原理
    poptest老李谈数据库优化总结
    poptest老李谈jvm的GC
    poptest老李谈分布式与集群 2
    poptest老李谈分布式与集群 1
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 3
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 2
    POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 1
    老李谈JVM内存模型
    Oracle常见语法错误
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/10739940.html
Copyright © 2020-2023  润新知