標籤:
1. 串連資料庫
在做項目的時候,我們都需要通過程式來訪問SQL Server
通過ADO.NET 這一技術,我們可以在程式中,向資料庫提交執行SQL語句的一堆類。
本機訪問直接存取“Windows驗證”,但是一般項目都是單獨的資料庫伺服器,程式在另外一台電腦上串連SQLServer,保障安全操作。
在做項目過程中不要啟用sa賬戶,而是建立專用的賬戶,這是基於安全考慮。
啟用sa賬戶的方法:進入屬性頁面後,可以啟用sa賬戶和修改密碼
2. 串連資料庫的字串
在C#代碼中,用來串連資料庫的字串格式:
Data Source=127.0.0.1,1433;
Initial Catalog=mydb;
User ID=sa;
Password=123456
Data Source 要串連的資料庫的IP地址和連接埠,IP地址,連接埠,IP地址必須填寫,連接埠可以不填寫。串連原生話填 . 或者127.0.0.1 就可以了; 其他機子的話,填寫IP地址,如192.168.1.100。
Initial Catalog 要訪問的資料庫名
User ID 使用者名稱
Password 密碼
3. 使用代碼串連資料庫
要想使用SqlConnection類 必須引用下面的命名空間: using System.Data.SqlClient;
通過SqlConnection類建立到SQLServer的串連,SqlConnection代表一個資料庫連接。
string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; using (SqlConnection conn = new SqlConnection(strConn))
{ conn.Open();
// do something }
為什麼串連資料庫的時候,使用了關鍵字 using ?
1. 通過使用using,可以達到簡化資源釋放的目的,凡是繼承了IDisposable 介面的類都可以通過using來達到自動釋放資源的目的。執行到 } 這裡的時候,就會自動執行釋放資源的方法。我們不必再寫close()、Dispose()等方法來關閉和釋放資源。這也是微軟提供的一個簡化資源釋放的方式。
2. 如果資料庫的串連一直被佔用的話,假如佔用的用戶端很多時,伺服器就會不堪重負了。另外,由於網路的不穩定性,容易造成不必要的麻煩。所以在需要對資料庫進行操作的時候,去開啟資料庫的串連,不需要的時候及時地關閉。這樣伺服器就可以同時承受更多用戶端的訪問。
1 string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; 2 using (SqlConnection conn = new SqlConnection(strConn)) 3 { 4 conn.Open(); 5 //通過SqlCommand類向資料庫發出指令 6 using (SqlCommand cmd = conn.CreateCommand()) 7 { 8 //直接拼接字串的查詢語句,在輸入 1‘ or ‘1‘ = ‘1 後,會出現SQL注入漏洞攻擊 9 //cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘";10 11 //可以擁有多個參數12 cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age";13 //需要對多個參數進行依次賦值14 cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text));15 cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text));16 17 //用來從伺服器中讀取資料的類18 using (SqlDataReader reader = cmd.ExecuteReader())19 {20 while (reader.Read())21 {22 MessageBox.Show(tBoxStaffName_Copy.Text + "的年齡是" + tBoxStaffAge.Text + ",工資是:" + reader["Salary"]);23 }24 }25 }26 }
4. SQLCommand類
向資料庫發出指令的類
要執行的SQL語句儲存在 CommandText 這個屬性中。
常用的方法:
1. void ExecuteNonQuery() 一般用來執行Update、Delete、Insert類型的sql語句 ,也就是執行非查詢類型的sql語句。
2. Object ExecuteScalar() 返回一個Object類型的值,一般用來執行只有一行或一列的傳回值的SQL語句。
3. SqlDataReader ExecuteReader() 用來執行有多條查詢結果的SQL語句。
4. SQLDataReader類
通過它,我們可以從伺服器中讀取資料,一般來說這些資料會比較大。它所獲得的查詢結果是放在資料庫中的,如果將這些資料傳到用戶端的話,會佔用用戶端太多的記憶體。所以這個類在查詢結果資料量較大的時候使用。
讀取這些資料的方法:
我們可以通過索引器或者GetString、GetInt32等方法來擷取資料。注意,通過索引器來讀取資料時,擷取的資料的類型是Object類型,在項目中要將這些資料強轉為對應的類型。
while ( reader.Read() ) { Console.WriteLine( reader[0] ): //擷取第一列的資料 Console.WriteLine( reader["Name"] ): //擷取列名為Name這一列的資料 Console.WriteLine( reader.GetString(1) ): //第2列為string類型,擷取第2列的數值,string類型
}
初始時,指標指向第一條資料之前,每調用一次 Reader指標向下移動一格,只要沒有移動到最後一格之後,Read() 的傳回值就為true。
5. DataSet類
它相當於一個複雜集合,如 List
與SqlDataReader 不同的是,我們需要先將資料從伺服器傳送到用戶端的DataSet中,然後用戶端直接從這裡面擷取資料。所以,在所查詢的資料量較小的時候,使用DataSet可以減輕伺服器的負擔。
使用DataSet來讀取資料:
1 string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012"; 2 using (SqlConnection conn = new SqlConnection(strConn)) 3 { 4 conn.Open(); 5 using (SqlCommand cmd = conn.CreateCommand()) 6 { 7 cmd.CommandText = "select * from T_Staff"; 8 9 //SqlDataAdapter是一個幫我們把SqlCommand查詢結果填充到DataSet中的類10 SqlDataAdapter adapter = new SqlDataAdapter(cmd);11 //DataSet相當於本地的一個複雜的集合(就像List一樣)12 DataSet dataSet = new DataSet();13 //執行查詢語句,並且將查詢結果填充到DataSet中14 adapter.Fill(dataSet);15 16 //把查詢的結果放入表中17 DataTableCollection tableColl = dataSet.Tables;18 DataTable table = tableColl[0];19 //集合中放的是每一行的資料20 DataRowCollection rowsColl = table.Rows;21 22 //使用迴圈來擷取每一行的資料23 foreach (DataRow row in rowsColl)24 {25 lStaff.Add(new Staff()26 {27 Name = (string)row["Name"],28 Age = (int)row["Age"],29 Sex = (bool)row["Sex"],30 Height = (decimal)row["Height"],31 Salary = (decimal)row["Salary"],32 Department = (string)row["Department"]33 });34 }35 }36 }
7. SQL語句參數化查詢
採用直接拼接sql語句字串的方法
cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘";
這裡的tBoxStaffName.Text 通常是用戶端的文字框上的內容,這樣做容易出現SQL注入漏洞攻擊。
cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘1‘ or ‘1‘ = ‘1‘";
執行上的語句後,會把表中所有員工的工資都查出來,造成了資料的泄漏。
為了避免這樣的問題,我們使用參數化查詢。
1. 先將參數放入sql語句中,參數的格式: @Name ,必須以@開頭
2. 對參數進行賦值
//直接拼接字串的查詢語句,在輸入 1‘ or ‘1‘ = ‘1 後,會出現SQL注入漏洞攻擊 //cmd.CommandText = "select Salary from T_Staff WHERE Name = ‘" + tBoxStaffName.Text + "‘"; //可以擁有多個參數 cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age"; //需要對多個參數進行依次賦值 cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text)); cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text));
注意:參數不能用來替換表名、欄位名、select之類的關鍵字等。
訪問資料庫