訪問資料庫

來源:互聯網
上載者:User

標籤:

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之類的關鍵字等。

 

訪問資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.