ADO.NET

1、ADO.NET概要

ADO.NET是.NET框架中的重要組件,主要用於完成C#應用程序訪問數據庫git

2、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           → 數據庫事物

3、Connection鏈接對象

Connection對象也稱爲數據庫鏈接對象,Connection對象的功能是負責對數據源的鏈接。全部Connection對象的基類都是DbConnection類。 sql

3.一、鏈接字符串

基本語法:數據源(Data Source)+數據庫名稱(Initial Catalog)+用戶名(User ID)+密碼(Password)數據庫

3.1.一、SQL Server鏈接字符串

標準安全鏈接: 安全

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

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

可信鏈接:ide

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

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

3.1.二、Access鏈接字符串

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

3.1.三、MySQL鏈接字符串

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

3.1.四、DB2鏈接字符串

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

3.1.五、Oracle鏈接字符串

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

在VS中得到鏈接字符串並鏈接到數據庫:

工具->鏈接到數據庫

選擇SQLServer

繼續

如上圖,填寫好相關信息

在高級中能夠查看鏈接字符串的全部信息

在VS中能夠實現數據庫管理:

3.二、鏈接到數據庫

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.一、建立數據庫與表

/**建立數據庫*/
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.二、建立窗體項目MyCar

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("關閉數據庫成功");
        }
    }
}

執行結果:

4、Command對象

Command對象也稱爲數據庫命令對象,Command對象主要執行包括添加、刪除、修改及查詢數據的操做的命令。也能夠用來執行存儲過程。用於執行存儲過程時須要將Command對象的CommandType 屬性設置爲CommandType.StoredProcedure,默認狀況下CommandType 屬性爲CommandType.Text,表示執行的是普通SQL語句。
Command主要有三個方法: 

4.一、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.一、拼接字符串

        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.二、參數

若是直接拼接字符串會存在安全隱患,使用參數能夠解決問題。

        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.三、刪除

這裏的示例是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.二、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"); 

5、ExecuteReader得到數據

ExecuteReader用於實現只進只讀的高效數據查詢

ExecuteReader:返回一個SqlDataReader對象,能夠經過這個對象來檢查查詢結果,它提供了只進只讀的執行方式,即從結果中讀取一行以後,移動到另外一行,則前一行就沒法再用。有一點要注意的是執行以後,要等到手動去調用Read()方法以後,DataReader對象纔會移動到結果集的第一行,同時此方法也返回一個Bool值,代表下一行是否可用,返回True則可用,返回False則到達結果集末尾。

使用DataReader能夠提升執行效率,有兩種方式能夠提升代碼的性能:

一種是基於序號的查找

一個是使用適當的Get方法來查找。由於查詢出來的結果通常都不會改變,除非再次改動查詢語句,所以能夠經過定位列的位置來查找記錄。用這種方法有一個問題,就是可能知道一列的名稱而不知道其所在的位置,這個問題的解決方案是經過調用DataReader 對象的GetOrdinal()方法,此方法接收一個列名並返回此列名所在的列號。

5.一、使用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.二、實體類

實體類用於封裝及映射數據。

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.三、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.四、刪除功能

示例代碼:

        /// <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.五、編輯功能

示例代碼:

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 + "行!");
            }
        }
    }
}

運行結果:

6、綜合示例

完成一我的事管理系統(HR)中的員工(Emp)管理模塊,要求實現以下功能:

6.一、建立數據庫與表

6.1.一、建立HR數據庫

--建立數據庫
create database HR;

結果:

6.1.二、建立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.二、建立項目與實體類

6.2.一、建立項目

這裏一樣建立一個WinForms窗體項目

6.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.三、封裝數據訪問

爲了不重複的數據訪問代碼,這裏咱們封裝了一個數據庫訪問工具類: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.三、實現展現功能

示例代碼:

        #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.四、實現新增功能

示例代碼:

按鈕事件:

            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.五、實現刪除功能

示例代碼:

        #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.六、實現編輯功能

示例代碼:

按鈕事件:

            //取得索引
            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.七、實現搜索功能

示例代碼:

按鈕:

        #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.八、全部代碼與擴展

FormMain.cs

using HR.Utils;
using System.Data.SqlClient;

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;

namespace HR
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        /// <summary>
        /// 員工管理菜單項
        /// </summary>
        private void tsmiEmp_Click(object sender, EventArgs e)
        {
            FormEmp emp = new FormEmp();
            emp.MdiParent = this;
            emp.Show();
        }
    }
}
View Code

FormEmp.cs

using HR.Models;
using HR.Utils;
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 HR
{
    public partial class FormEmp : Form
    {
        List<Emp> emps = null;

        public FormEmp()
        {
            InitializeComponent();
            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

        #region 新增
        private void btnAdd_Click(object sender, EventArgs e)
        {
            FormAdd add = new FormAdd();
            add.ShowDialog();
            BindData();
        }
        #endregion

        #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

        #region 修改
        private void btnEdit_Click(object sender, EventArgs e)
        {
            //取得索引
            int index=dgvEmp.SelectedRows[0].Index;
            FormEdit edit = new FormEdit();
            edit.emp = emps[index];
            edit.ShowDialog();
            BindData();
        }
        #endregion

        #region 查詢
        private void btnQuery_Click(object sender, EventArgs e)
        {
            BindData();
        }
        #endregion
    }
}
View Code

FormAdd.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 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+"行!");
        }
    }
}
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;
        }
    }
}
View Code

擴展:多刪除(一次選擇多行刪除)、多條件組合搜索、分頁。

7、做業

7.一、大做業

實現一個產品管理系統(GoMall),完成對產品(Product)的維護。

1)、建立一個數據庫GoMall

2)、定義一個表產口Product(編號Id,名稱Name,價格Price,詳細Details),添加5個測試數據

3)、建立一個Winform項目,名稱爲GoMall

4)、完成展現功能

5)、完成新增功能

6)、完成刪除功能

7)、完成修改功能

8)、擴展功能,添加一個類型表,在產品中添加類型外鍵;實現按名稱搜索功能。

7.二、第1次小做業

一、使用ADO.NET實現增長,刪除操做,要求3個字段以上,同時用拼接字符串與帶參數的兩種辦法。

二、使用ExecuteScalar實現單行單列值的查詢。

7.三、第2次小做業

一、使用ADO.NET實現「展現」功能。

二、使用ADO.NET實現「刪除」功能。

三、使用ADO.NET實現「編輯」功能。

8、視頻與資料下載

示例:https://coding.net/u/zhangguo5/p/ADO.NET/git

視頻:地址https://www.bilibili.com/video/av15651626/

相關文章
相關標籤/搜索