ADO.NET是.NET框架中的重要組件,主要用於完成C#應用程序訪問數據庫。git
①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對象的基類都是DbConnection類。 sql
基本語法:數據源(Data Source)+數據庫名稱(Initial Catalog)+用戶名(User ID)+密碼(Password)數據庫
標準安全鏈接: 安全
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; 工具
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myDatabase.mdb;User Id=admin;Password=;性能
Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;
Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;
Data Source=TORCL;User Id=myUsername;Password=myPassword;
在VS中得到鏈接字符串並鏈接到數據庫:
工具->鏈接到數據庫
選擇SQLServer
繼續
如上圖,填寫好相關信息
在高級中能夠查看鏈接字符串的全部信息
在VS中能夠實現數據庫管理:
Connection對象有兩個重要屬性:
(1)ConnectionString:表示用於打開 SQL Server 數據庫的字符串;
(2)State:表示 Connection 的狀態,有Closed和Open兩種狀態。
Connection對象有兩個重要方法:
(1)Open()方法:指示打開數據庫;
(2)Close()方法:指示關閉數據庫。
//建立鏈接對象1 using (SqlConnection conn1 = new SqlConnection("鏈接字符串")) { conn1.Open(); }
/**建立數據庫*/ 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
建立鏈接對象,打開數據
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對象的CommandType 屬性設置爲CommandType.StoredProcedure,默認狀況下CommandType 屬性爲CommandType.Text,表示執行的是普通SQL語句。
Command主要有三個方法:
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(); //} }
執行結果:
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("新增成功!"); } }
執行:
若是直接拼接字符串會存在安全隱患,使用參數能夠解決問題。
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("新增成功!"); } }
執行結果:
這裏的示例是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+"行!"); } }
執行結果:
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:返回一個SqlDataReader對象,能夠經過這個對象來檢查查詢結果,它提供了只進只讀的執行方式,即從結果中讀取一行以後,移動到另外一行,則前一行就沒法再用。有一點要注意的是執行以後,要等到手動去調用Read()方法以後,DataReader對象纔會移動到結果集的第一行,同時此方法也返回一個Bool值,代表下一行是否可用,返回True則可用,返回False則到達結果集末尾。
使用DataReader能夠提升執行效率,有兩種方式能夠提升代碼的性能:
一種是基於序號的查找
一個是使用適當的Get方法來查找。由於查詢出來的結果通常都不會改變,除非再次改動查詢語句,所以能夠經過定位列的位置來查找記錄。用這種方法有一個問題,就是可能知道一列的名稱而不知道其所在的位置,這個問題的解決方案是經過調用DataReader 對象的GetOrdinal()方法,此方法接收一個列名並返回此列名所在的列號。
示例代碼:
//查詢 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"]); } } }
運行結果:
實體類用於封裝及映射數據。
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; } } }
示例代碼:
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(); //關閉 } } } }
運行結果:
示例代碼:
/// <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(); //從新綁定 } }
運行結果:
示例代碼:
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)管理模塊,要求實現以下功能:
--建立數據庫 create database HR;
結果:
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
結果:
這裏一樣建立一個WinForms窗體項目
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; } } }
爲了不重複的數據訪問代碼,這裏咱們封裝了一個數據庫訪問工具類: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();
示例代碼:
#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
運行結果:
示例代碼:
按鈕事件:
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+"行!"); } } }
運行結果:
示例代碼:
#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
運行結果:
示例代碼:
按鈕事件:
//取得索引 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; } } }
運行結果:
示例代碼:
按鈕:
#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
運行結果:
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(); } } }
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 } }
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+"行!"); } } }
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; } } }
擴展:多刪除(一次選擇多行刪除)、多條件組合搜索、分頁。
實現一個產品管理系統(GoMall),完成對產品(Product)的維護。
1)、建立一個數據庫GoMall
2)、定義一個表產口Product(編號Id,名稱Name,價格Price,詳細Details),添加5個測試數據
3)、建立一個Winform項目,名稱爲GoMall
4)、完成展現功能
5)、完成新增功能
6)、完成刪除功能
7)、完成修改功能
8)、擴展功能,添加一個類型表,在產品中添加類型外鍵;實現按名稱搜索功能。
一、使用ADO.NET實現增長,刪除操做,要求3個字段以上,同時用拼接字符串與帶參數的兩種辦法。
二、使用ExecuteScalar實現單行單列值的查詢。
一、使用ADO.NET實現「展現」功能。
二、使用ADO.NET實現「刪除」功能。
三、使用ADO.NET實現「編輯」功能。
示例:https://coding.net/u/zhangguo5/p/ADO.NET/git