一、ADO.NET概要
二、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連接對象
3.1、連接字符串
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連接字符串
3.1.3、MySQL連接字符串
3.1.4、DB2連接字符串
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 + "行!");
}
}
}
}
運行結果:

六、綜合示例
6.1、創建數據庫與表
6.1.1、創建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、創建項目
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
View Code
擴展:多刪除(一次選擇多行刪除)、多條件組合搜索、分頁。
七、作業
7.1、大作業
實現一個產品管理系統(GoMall),完成對產品(Product)的維護。
1)、創建一個數據庫GoMall
2)、定義一個表產口Product(編號Id,名稱Name,價格Price,詳細Details),添加5個測試數據
3)、創建一個Winform項目,名稱為GoMall
4)、完成展示功能
5)、完成新增功能
6)、完成刪除功能
7)、完成修改功能
8)、擴展功能,添加一個類型表,在產品中添加類型外鍵;實現按名稱搜索功能。
7.2、第1次小作業
7.3、第2次小作業
八、視頻與資料下載
示例:https://coding.net/u/zhangguo5/p/ADO.NET/git
視頻:地址https://www.bilibili.com/video/av15651626/
轉載自:https://www.cnblogs.com/best/p/7714500.html#undefined。






