ADO.NET
這一節所涉及的數據庫下面給出了其創建的SQL語句:
(blog數據庫及employee表的創建語句)

1 create database blog 2 3 use blog 4 5 create table employee 6 ( 7 eid int primary key identity, 8 ename varchar(20) not null, 9 esex bit default 1 not null, 10 eage int not null, 11 esalary int not null, 12 eaddress varchar(100) 13 ) 14 go 15 insert into employee values ('孫悟空',default,23,5000,'花果山') 16 insert into employee values ('豬八戒',default,40,3500,'高老庄') 17 insert into employee values ('沙悟凈',default,45,4000,'流沙河') 18 insert into employee values ('唐僧',default,18,5000,'大唐') 19 insert into employee values ('林沖',default,18,6000,'東京') 20 insert into employee values ('孫二娘',0,33,4500,'黑店') 21 insert into employee values ('武松',default,35,4600,'景陽岡') 22 insert into employee values ('宋江',default,50,5000,'梁山') 23 insert into employee values ('諸葛亮',default,23,5000,'卧龍崗') 24 insert into employee values ('劉備',default,45,5500,'巴蜀') 25 insert into employee values ('關羽',default,43,4000,'巴蜀') 26 insert into employee values ('張飛',default,42,3500,'巴蜀') 27 insert into employee values ('曹操',default,28,8000,'魏國') 28 insert into employee values ('孫權',default,86,6000,'吳國') 29 insert into employee values ('迎春',0,18,1200,'賈府') 30 insert into employee values ('元春',0,19,1300,'賈府') 31 insert into employee values ('探春',0,20,1400,'賈府') 32 insert into employee values ('惜春',0,21,1500,'賈府') 33 insert into employee values ('秋香',0,22,1600,'賈府') 34 insert into employee values ('冬香',0,23,1700,'賈府') 35 insert into employee values ('夏香',0,24,1800,'賈府') 36 insert into employee values ('春香',0,25,1900,'賈府') 37 insert into employee values ('賈寶玉',1,26,3000,'賈府') 38 insert into employee values ('王熙鳳',0,35,5000,'賈府') 39 insert into employee values ('葫蘆僧',default,5,800,'葫蘆秒') 40 insert into employee values ('林黛玉',0,18,3000,'賈府') 41 insert into employee values ('聶小倩',0,23,4300,'墳墓') 42 insert into employee values ('寧采臣',default,23,1500,'荒野') 43 insert into employee values ('燕赤霞',default,56,5000,'道觀') 44 insert into employee values ('蕭峰',default,45,8000,'大遼') 45 insert into employee values ('段譽',default,26,8500,'大理') 46 insert into employee values ('虛竹',default,34,4000,'縹緲峰') 47 insert into employee values ('慕容復',default,35,5500,'燕子塢')
一.SqlConnection對象: SqlConnection表示SQL Server 數據庫的一個打開的連接,無法繼承。它是連接字符串(搜集連接數據的信息)正如下面示例中的string strcon = "server=.;database=blog;uid=sa;pwd=1";語句。SqlConnection構造函數:1.SqlConnection() 需要顯式的設置ConectionString屬性 2.SqlConnection(string connectionString);參數是給定包含連接字符串的字符串后,初始化SqlConnection新實例,在c#中定義為:public SqlConnection(string connectionString)。常用屬性: ConnectionString:設置或獲取用於打開SQL Server 數據庫的字符串。 State:指示SqlConnection狀態,c#中定義為:public ConnectionState State{get;} 而ConnectionState在c#中定義為:public enum ConnectionState 它是枚舉類型,成員名有:Closed Open Connecting Executing Fetching Broken。常用方法:Open 和 Close 用來打開或關閉數據庫連接
體會下面兩段代碼的不同點:

1 using System; 2 using System.Data.SqlClient; 3 4 public class StudyADO01 5 { 6 public static void Main() 7 { 8 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 9 SqlConnection con = new SqlConnection(strcon); 10 using(con) 11 { 12 con.Open(); 13 Console.WriteLine(con.State); 14 } 15 Console.WriteLine(con.State); 16 } 17 } 18 19 //所用的構造函數不同,關閉方式也不一樣 20 using System; 21 using System.Data.SqlClient; 22 23 public class StudyADO01 24 { 25 public static void Main() 26 { 27 SqlConnection con = new SqlConnection(strcon); 28 //設置連接字符串 29 con.ConnectionString = "server=.;database=blog;uid=sa;pwd=1"; 30 con.Open(); 31 Console.WriteLine(con.State); 32 con.Close(); 33 Console.WriteLine(con.State); 34 Console.WriteLine(con.State); 35 } 36 }
二.SqlCommand 對象:用來執行SQL語句,它表示對SQL Server數據庫執行的一個Transact-SQL語句或存儲過程。無法繼承。構造函數:1.SqlCommand()用來實例SqlCommand初始屬性值:CommandText(cmdText)設置要執行SQL語句;CommandType(CommandType.Text)獲取或設置一個值,該值指示如何解釋CommandText屬性(設置sql語句執行的方式),它在c#中定義為:public override CommandType CommandType{set;get;},作為返回值的CommandType的類型是枚舉:public enum CommandType,有三個成員:1.Text 2.StoredProcedure 3.TableDirect(表的名稱); Connection( connection)設置SqlCommand對象的數據庫連接。. 2。SqlCommand(string) 定義:public SqlCommand(string cmdText)。 3.SqlCommand(string,SqlConnection) 定義:public SqlCommand(string cmdText,SqlConnection connection)。ExecuteNonQuery方法執行的是非查詢語句,其定義為:public override int ExecuteNonQuery()返回int類型數值。非查詢語句:ExecuteNonQuery()只能用來執行非查詢語句,返回影響的行數。
下面給出倆示例予以解釋:
插入數據的非查詢語句:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 public class StudyADO02 6 { 7 public static void Main() 8 { 9 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 10 SqlConnection con = new SqlConnection(strcon); 11 SqlCommand cmd = new SqlCommand(); 12 string name = "陳一冰"; 13 int sex = 1; 14 int age = 39; 15 int salary = 7000; 16 string address = "China"; 17 using(con) 18 { 19 con.Open(); 20 using(cmd) 21 { 22 //把已經打開數據庫的連接賦值給cmd,讓cmd對象知道SQL語句要在那個數據庫上執行 23 cmd.Connection = con; 24 //設置要執行的sql語句 25 cmd.CommandText = "insert into employee values ('"+name+"',"+sex+","+age+","+salary+",'"+address+"')"; 26 //設置執行SQL語句的方式 27 cmd.CommandType = CommandType.Text; 28 //開始執行 29 int i=cmd.ExecuteNonQuery(); 30 if(i!=0) 31 { 32 Console.WriteLine("執行成功"); 33 } 34 } 35 } 36 37 } 38 }
刪除記錄的非查詢語句:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 public class StudyADO03 6 { 7 public static void Main() 8 { 9 //刪除eid =56的記錄 10 Delete("56","employee","eid"); 11 12 } 13 public static void Delete(string eid,string table,string key) 14 { 15 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 16 SqlConnection con = new SqlConnection(strcon); 17 SqlCommand cmd = new SqlCommand(); 18 19 using(con) 20 { 21 con.Open(); 22 using(cmd) 23 { 24 //把已經打開數據庫的連接賦值給cmd,讓cmd對象知道SQL語句要在那個數據庫上執行 25 cmd.Connection = con; 26 //設置要執行的sql語句 27 cmd.CommandText = "delete from "+table+" where "+key+" ="+eid; 28 //Console.WriteLine(cmd.CommandText); 29 //設置執行SQL語句的方式 30 cmd.CommandType = CommandType.Text; 31 //開始執行 32 int i=cmd.ExecuteNonQuery(); 33 if(i!=0) 34 { 35 Console.WriteLine("執行成功"); 36 } 37 } 38 } 39 } 40 }
Parameters和SqlParameter:Parameters獲取SqlParametersCollection集合,是SqlCommand對象的屬性。SqlParametersCollection代表了CommandText中出現的參數的集合,集合中的元素是SqlParameter類型。c#中定義為:public SqlParameterCollection Parameters{get;} SqlParametersCollection表示與SqlCommand相關聯的參數的集合以及各個參數到DataSet中的映射。常用SqlParametersCollection的Add方法向集合中添加SqlParameter 它的定義:public SqlParameter Add(string ParameterName,SqlDbType sqlDbType,int size)返回值SqlParameter指的是新的SqlParameter對象。 Item能獲取具有指定屬性的SqlParameter常用索引有: Item[int index] Item[String name](public SqlParameter Item[string parameterName] {get;set;}) 這兩個索引將會返回指定位置或名字的SqlParameter對象。SqlParameter:代表了數據庫中的參數。構造函數:SqlParameter()創建一個空的數據庫變量對象,需要設置ParameterName:參數對象對應的數據庫的變量名字SqlDbType:參數對象在數據庫中的數據類型Size:數據類型的大小Value:變量的值。 如果參數不需要制定長度則使用構造函數SqlPatameter(String,SqlDbType)。。 SqlParameter(String,SqlDbType,Size) 設置了參數的名稱,類型,大小。
常見的傳參的形式:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 public class StudyADO02 6 { 7 public static void Main() 8 { 9 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 10 SqlConnection con = new SqlConnection(strcon); 11 SqlCommand cmd = new SqlCommand(); 12 13 using(con) 14 { 15 16 using(cmd) 17 { 18 //把已經打開數據庫的連接賦值給cmd,讓cmd對象知道SQL語句要在那個數據庫上執行 19 cmd.Connection = con; 20 SqlParameter pname = new SqlParameter("@name",SqlDbType.VarChar,20); 21 SqlParameter psex = new SqlParameter("@sex",SqlDbType.Bit); 22 SqlParameter page = new SqlParameter("@age",SqlDbType.Int,4); 23 SqlParameter psalary = new SqlParameter("@salary",SqlDbType.Int,4); 24 SqlParameter paddrss = new SqlParameter(); 25 26 pname.Value = "陳一冰"; 27 psex.Value = 1; 28 page.Value = 39; 29 psalary.Value = 7000; 30 paddrss.Value = "china"; 31 cmd.Parameters.Add(pname); 32 cmd.Parameters.Add(psex); 33 cmd.Parameters.Add(page); 34 cmd.Parameters.Add(psalary); 35 cmd.Parameters.Add(paddrss); 36 37 //設置要執行的sql語句 38 cmd.CommandText = "insert into employee values (@name,@sex,@age,@salary,@addrss)"; 39 //設置執行SQL語句的方式 40 cmd.CommandType = CommandType.Text; 41 //開始執行 42 con.Open(); 43 int i=cmd.ExecuteNonQuery(); 44 if(i!=0) 45 { 46 Console.WriteLine("執行成功"); 47 } 48 } 49 } 50 51 } 52 }
SqlParameter參數不同演變中的三個形態:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 public class StudyADO02 6 { 7 public static void Main() 8 { 9 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 10 SqlConnection con = new SqlConnection(strcon); 11 SqlCommand cmd = new SqlCommand(); 12 13 using(con) 14 { 15 16 using(cmd) 17 { 18 //把已經打開數據庫的連接賦值給cmd,讓cmd對象知道SQL語句要在那個數據庫上執行 19 cmd.Connection = con; 20 21 22 /* 23 //最初的形式: 24 SqlParametersCollection collection =cmd.Parameters; 25 collection.Add("@name",SqlDbType.VarChar,20); 26 SqlParameters p = collection["@name"]; 27 p.Value = "sss"; 28 29 //上面四句化簡為兩句 30 cmd.Parameters.Add("@name",SqlDbType.VarChar,20); 31 cmd.Parameters["@name"].Value = "ss"; 32 33 //整體代換,最總可化簡為一句 34 cmd.Parameters.Add("@name",SqlDbType.VarChar,20).Value = "ss" 35 */ 36 37 //常用形式 38 cmd.Parameters.Add("@name",SqlDbType.VarChar,20); 39 cmd.Parameters["@name"].Value = "ss"; 40 41 //設置要執行的sql語句 42 cmd.CommandText = "insert into employee values (@name,@sex,@age,@salary,@addrss)"; 43 //設置執行SQL語句的方式 44 cmd.CommandType = CommandType.Text; 45 //開始執行 46 con.Open(); 47 int i=cmd.ExecuteNonQuery(); 48 if(i!=0) 49 { 50 Console.WriteLine("執行成功"); 51 } 52 } 53 } 54 55 } 56 }
以上示例全部為非查詢語句,下面所講述的為查詢語句:ExecuteReader():用來執行查詢語句,返回SqlDataReader對象SqlDataReader數據讀取器,只能向下讀,而起是只讀數據,並且在讀取數據的時候不能和數據庫斷開連接。當使用完畢后,記着釋放資源。常用屬性 HasRows:判斷是否有記錄。 FieldCount:實際查詢出得結果中有多少列。 Item[index]:根據列的索引拿出結果。 Item[name]:根據列的名字拿出結果。常用方法: Read:首先判斷有沒有記錄,如果有記錄的話,則下移一行。 Close:關閉
查詢語句且有參數的例子:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 public class StudyReader 5 { 6 public static void Main() 7 { 8 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 9 SqlConnection con = new SqlConnection(strcon); 10 SqlCommand cmd = new SqlCommand(); 11 cmd.Connection = con; 12 cmd.CommandText = "select * from employee where eid=@eid"; 13 cmd.Parameters.Add("@eid",SqlDbType.Int,4); 14 cmd.Parameters["@eid"].Value = 23; 15 con.Open(); 16 //把查詢結果返回出來,並賦值給SqlDataReader 17 SqlDataReader reader = cmd.ExecuteReader(); 18 while(reader.Read()) 19 { 20 Console.WriteLine(reader["ename"].ToString()+" "+reader["eaddress"].ToString()); 21 } 22 reader.Close(); 23 cmd.Dispose(); 24 con.Close(); 25 26 } 27 }
把上面代碼換為using來釋放資源:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 public class StudyReader 5 { 6 public static void Main() 7 { 8 string strcon = "server=.;database=blog;uid=sa;pwd=1"; 9 SqlConnection con = new SqlConnection(strcon); 10 SqlCommand cmd = new SqlCommand(); 11 using(con) 12 { 13 using(cmd) 14 { 15 cmd.Connection = con; 16 cmd.CommandText = "select * from employee where eid=@eid"; 17 cmd.Parameters.Add("@eid",SqlDbType.Int,4); 18 cmd.Parameters["@eid"].Value = 23; 19 con.Open(); 20 //把查詢結果返回出來,並賦值給SqlDataReader 21 SqlDataReader reader = cmd.ExecuteReader(); 22 using(reader) 23 { 24 while(reader.Read()) 25 { 26 Console.WriteLine(reader["ename"].ToString()+" "+reader["eaddress"].ToString()); 27 } 28 } 29 30 31 } 32 } 33 34 35 36 } 37 }
有了上面的基礎我們就可以做一個自己的數據庫助手類,就是我們日常生活中在搭建三成構架的時候要創建的SqlHelper:
創建數據庫助手類的步驟:
/* 1,創建ADO.NEt對象 2,初始化sql和參數 3,執行 4,關閉 */

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 public class TestHelper 5 { 6 public static void Main() 7 { 8 string strcon = "server = .;database = blog;uid = sa;pwd = 1"; 9 SqlHelper helper = new SqlHelper(strcon); 10 /* 11 //查找員工表中員工姓名和住址字段(無參查詢語句) 12 string sql = "select * from employee"; 13 SqlDataReader reader = helper.ExecuteQuery(sql); 14 using(reader) 15 { 16 while(reader.Read()) 17 { 18 Console.WriteLine(reader["eid"].ToString() + " " + reader["ename"].ToString()); 19 } 20 } 21 helper.Close();*/ 22 //含參的非查詢語句 23 string sql = "insert into employee values(@name,@sex,@age,@salary,@address)"; 24 SqlParameter[] p = new SqlParameter[]{ 25 new SqlParameter("@name",SqlDbType.VarChar,20), 26 new SqlParameter("@sex",SqlDbType.Bit), 27 new SqlParameter("@age",SqlDbType.Int), 28 new SqlParameter("@salary",SqlDbType.Int), 29 new SqlParameter("@address",SqlDbType.VarChar,20) 30 }; 31 p[0].Value = "qqq"; 32 p[1].Value = 0; 33 p[2].Value = 23; 34 p[3].Value = 5000; 35 p[4].Value = "China"; 36 helper.ExecuteNonQuery(sql,p); 37 helper.Close(); 38 } 39 } 40 public class SqlHelper 41 { 42 private SqlConnection con = null; 43 private SqlCommand cmd = null; 44 private string connectionString; 45 public string ConnectionString 46 { 47 get{return this.connectionString;} 48 set{this.connectionString = value;} 49 } 50 51 public SqlHelper (string strcon) 52 { 53 this.connectionString = strcon; 54 con = new SqlConnection(strcon); 55 cmd = new SqlCommand(); 56 cmd.Connection = con; 57 } 58 /* 59 執行非查詢語句 60 */ 61 //執行含有參數的SQL語句 62 public int ExecuteNonQuery(string sql,params SqlParameter[] param) 63 { 64 PreparedCommand(sql,param); 65 int result = cmd.ExecuteNonQuery(); 66 con.Close(); 67 return result; 68 } 69 //重載上述方法,查詢語句中沒有參數。 70 public int ExecuteNonQuery(string sql) 71 { 72 PreparedCommand(sql,null); 73 int result = cmd.ExecuteNonQuery(); 74 con.Close(); 75 return result; 76 } 77 /* 78 執行查詢語句 79 */ 80 //執行含有參數的SQL語句 81 public SqlDataReader ExecuteQuery(string sql,params SqlParameter[] param) 82 { 83 PreparedCommand(sql,param); 84 return cmd.ExecuteReader(); 85 86 } 87 //重載上述方法,查詢語句中沒有參數。 88 public SqlDataReader ExecuteQuery(string sql) 89 { 90 PreparedCommand(sql,null); 91 return cmd.ExecuteReader(); 92 } 93 private void PreparedCommand(string sql,params SqlParameter[] param) 94 { 95 /* 96 SqlCommand cmd1 = null; 97 if(cmd != null) 98 { 99 cmd1 = cmd; 100 } 101 else 102 { 103 cmd1 = new SqlCommand(); 104 } 105 */ 106 cmd.CommandText = sql; 107 //清空Parameters中的參數 108 cmd.Parameters.Clear(); 109 if(param != null) 110 { 111 foreach(SqlParameter p in param) 112 { 113 cmd.Parameters.Add(p); 114 } 115 } 116 con.Open();; 117 } 118 /* 119 打開數據庫連接 120 */ 121 private void Open() 122 { 123 con.Open(); 124 } 125 /* 126 關閉數據庫連接 127 */ 128 public void Close() 129 { 130 cmd.Dispose(); 131 con.Close(); 132 } 133 }
最后要寫一個把數據庫數據轉換為對象的程序:

1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 using System.Collections.Generic; 5 public class StudyModel 6 { 7 public static void Main() 8 { 9 string strcon = "server = .;database = blog;uid = sa;pwd = 1"; 10 SqlConnection con = new SqlConnection(strcon); 11 SqlCommand cmd = new SqlCommand(); 12 List<Employee> list = new List<Employee>(); 13 using(con) 14 { 15 using(cmd) 16 { 17 cmd.Connection = con; 18 cmd.CommandText = "select * from employee"; 19 con.Open(); 20 SqlDataReader reader = cmd.ExecuteReader(); 21 using(reader) 22 { 23 Employee p = null; 24 while(reader.Read()) 25 { 26 p = new Employee(); 27 p.Eid = Convert.ToInt32(reader["eid"]); 28 p.Ename = reader["ename"].ToString(); 29 p.Esex = Convert.ToInt32(reader["esex"]); 30 p.Eage = Convert.ToInt32(reader["eage"]); 31 p.Esalary = Convert.ToInt32(reader["esalary"]); 32 p.Eaddress = reader["eaddress"].ToString(); 33 list.Add(p); 34 } 35 } 36 } 37 } 38 foreach(Employee pp in list) 39 { 40 Console.WriteLine(pp.Ename + " " + pp.Esex); 41 } 42 //Linq語句 43 /* 44 var result = from ps in list 45 where ps.Eage >30 46 select ps; 47 foreach(Employee ep in result) 48 { 49 Console.WriteLine(ep.Ename); 50 } 51 */ 52 } 53 } 54 /* 55 實體類,模型類 56 */ 57 public class Employee 58 { 59 public int Eid 60 { 61 get;set; 62 } 63 public string Ename 64 { 65 get;set; 66 } 67 public int Esex 68 { 69 get;set; 70 } 71 public int Eage 72 { 73 get;set; 74 } 75 public int Esalary 76 { 77 get;set; 78 } 79 public string Eaddress 80 { 81 get;set; 82 } 83 }