ASP.NET2.0 SQL Server數據庫連接詳解

今天學習建立ASP.NET 與SQL Server數據庫建立連接的方法,在網上搜到一片好文章,果斷收藏了!共勉!

     

     文將詳細介紹如何使用Connection對象連接數據庫 。對於不同的.NET 數據提供者,ADO.NET採用不同的Connection對象連接數據庫。這些Connection對象爲我們屏蔽了具體的實現細節,並提供了一種統一的實現方法。


Connection類有四種:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection。

SqlConnection類的對象連接SQL Server數據庫;

OracleConnection 類的對象連接Oracle數據庫;

OleDbConnection類的對象連接支持OLE DB的數據庫,如Access;

OdbcConnection類的對象連接任何支持ODBC的數據庫。與數據庫的所有通訊最終都是通過Connection對象來完成的。


SqlConnection類

  Connection 用於與數據庫“對話”,並由特定提供程序的類(如 SqlConnection)表示。儘管SqlConnection類是針對Sql Server的,但是這個類的許多屬性、方法與事件和OleDbConnection及OdbcConnection等類相似。現在重點講解 SqlConnection特定的屬性與方法,其他的Connection類你可以參考相應的幫助文檔。

  注意:使用不同的 Connection對象需要導入不同的命名空間。OleDbConnection的命名空間爲System.Data.OleDb。 SqlConnection的命名空間爲System.Data.SqlClient。OdbcConnection的命名空間爲 System.Data.Odbc。OracleConnection的命名空間爲System.Data.OracleClinet。

SqlConnection屬性:


SqlConnection方法:


SqlConnection事件:


       提示:可以用事件讓一個對象以某種方式通知另一對象產生某些事情。例如我們在Windows 系統中選擇“開始”菜單,一旦單擊鼠標 時,就發生了一個事件,通知操作系統 將“開始”菜單顯示出來。


 使用SqlConnection對象連接SQL Server數據庫 

  我們可以用SqlConnection()構造函數生成一個新的SqlConnection對象。這個函數是重載的,即我們可以調用構造函數的不同版本。SqlConnection()的構造函數如下表所示:



假設我們導入了System.Data.SqlClient命名空間,則可以用下列語句生成新的SqlConnection對象:

SqlConnection mySqlConnection = new SqlConnection();

程序代碼說明:在上述語法範例的程序代碼中,我們通過使用“new“關鍵字生成了一個新的SqlConnection對象,並且將其命名爲mySqlConnection。 

  現在我們就可以使用如下兩種方式連接數據庫,即採用集成的Windows驗證和使用Sql Server身份驗證進行數據庫的登錄。

  1)集成的Windows身份驗證語法範例

string connectionString = "server=localhost;database=Student; integrated security=SSPI";

程序代碼說明:在上述語法範例的程序代碼中,我們設置了一個針對Sql Server數據庫的連接字符串。其中server表示運行Sql Server的計算機 名,由於在本書中,ASP.NET程序和數據庫系統是位於同一臺計算機的,所以我們可以用localhost取代當前的計算機名。database表示所使用的數據庫名,這裏設置爲Sql Server自帶的一個示例數據庫——Student。由於我們希望採用集成的Windows驗證方式,所以設置 integrated security爲SSPI即可。

  Sql Server 2005中的Windows身份驗證模式如下:



2)採用Sql Server身份驗證的語法範例

<span style="font-size:14px;">string connectionString = "server=localhost;database=Student;uid=sa;pwd=yourpass";</span>

       程序代碼說明:在上述語法範例的程序代碼中,採用了使用已知的用戶名和密碼驗證進行數據庫的登錄。uid爲指定的數據庫用戶名,pwd爲指定的用戶口令。爲了安全起見,一般不要在代碼中包括用戶名和口令,你可以採用前面的集成的Windows驗證方式或者對Web .Config文件中的連接字符串加密的方式提高程序的安全性。


Sql Server 2005中的Sql Server身份驗證模式如下:




     如果你使用其他的數據提供者的話,所產生的連接字符串也具有相類似的形式。例如我們希望以OLE DB的方式連接到一個Oracle數據庫,其連接字符串如下:

string connectionString = "data source=localhost;initial catalog=Sales; use id=sa;password=;provider=MSDAORA";

程序代碼說明:在上述語法範例的程序代碼中,通過專門針對Oracle數據庫的OLE DB提供程序,實現數據庫的連接。data source 表示運行Oracle數據庫的計算機名,initial catalog表示所使用的數據庫名。provider表示使用的OLE DB提供程序爲MSDAORA。

  Access數據庫的連接字符串的形式如下:

string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;”data source=c:\DataSource\Student.mdb”;

      程序代碼說明:在上述語法範例的程序代碼中,通過專門針對Access數據庫的OLE DB提供程序,實現數據庫的連接。這使用的的OLE DB提供程序爲Microsoft.Jet.OLEDB.4.0,並且數據庫存放在c:\DataSource目錄下,其數據庫文件爲 student.mdb。

  現在我們就可以將數據庫連接字符串傳人SqlConnection()構造函數,例如:

string connectionString = "server=localhost;database=Student;uid=sa;pwd=yourpass";SqlConnection mySqlConnection = new SqlConnection(connectionString);

或者寫成

SqlConnection mySqlConnection =new SqlConnection("server=localhost;database=Student;uid=sa;pwd=yourpass");

在前面的範例中,通過使用“new“關鍵字生成了一個新的SqlConnection對象。因此我們也可以設置該對象的 ConnectionString屬性,爲其指定一個數據庫連接字符串。這和將數據庫連接字符串傳人SqlConnection()構造函數的功能是一樣的。


SqlConnection mySqlConnection = new SqlConnection();
mySqlConnection.ConnectionString = "server=localhost;database=Student;uid=sa;pwd=yourpass";

注意:只能在關閉Connection對象時設置ConnectionString屬性。

  打開和關閉數據庫連接 

  生成Connection對象並將其設置ConnectionString屬性設置爲數據庫連接的相應細節之後,就可以打開數據庫連接。爲此可以調用Connection對象的Open()方法。其方法如下:

mySqlConnection.Open();


  完成數據庫的連接之後,我們可以調用Connection對象的Close()方法關閉數據庫連接。例如:

mySqlConnection.Close();


  下面是一個顯示如何用SqlConnection對象連接Sql Server student數據庫的實例程序,並且顯示該SqlConnection對象的一些屬性。

  範例程序代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

 //建立數據庫連接字符串
 string connectionString = "server=localhost;database=Student; integrated security=SSPI";
 //將連接字符串傳入SqlConnection對象的構造函數中
 SqlConnection mySqlConnection = new SqlConnection(connectionString);
 try
 {
 //打開連接
 mySqlConnection.Open();
 //利用label控件顯示mySqlConnection對象的ConnectionString屬性
 lblInfo.Text = "mySqlConnection對象的ConnectionString屬性爲:" +
 mySqlConnection.ConnectionString + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的ConnectionTimeout屬性爲:" +
 mySqlConnection.ConnectionTimeout + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的Database屬性爲:" +
 mySqlConnection.Database + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的DataSource屬性爲:" +
 mySqlConnection.DataSource + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的PacketSize屬性爲:" +
 mySqlConnection.PacketSize + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的ServerVersion屬性爲:" +
 mySqlConnection.ServerVersion + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的當前狀態爲:" +
mySqlConnection.State + "<p></p>";
 }
catch (Exception err)
 {
 lblInfo.Text = "讀取數據庫出錯";
 lblInfo.Text += err.Message;
 }
 finally 
 {
//關閉與數據庫的連接
 mySqlConnection.Close();
 lblInfo.Text += "<p></p>關閉連接後的mySqlConnection對象的狀態爲:";
 lblInfo.Text += mySqlConnection.State.ToString();
 }

    }
}

程序代碼說明:在上述範例的程序代碼中,我們利用try catch finally對數據庫連接進行異常處理。當無法連接數據庫時將拋出異常,並顯示出錯信息,見catch代碼塊所示。在此程序中,無論是否發生異常,都可以通過finally區塊關閉數據庫的連接,從而節省計算機資源,提高了程序的效率和可擴展性。

  執行結果:


 

     當然,我們還可以採用一種更加簡便的方法來實現上述程序的功能。這就是將SqlConnection對象包含到using區塊中,這樣程序會自動調用Dispose()方法釋放SqlConnection對象所佔用的系統資源,無需再使用SqlConnection對象的Close()方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

 //建立數據庫連接字符串
 string connectionString = "server=localhost;database=Student; integrated security=SSPI";
 //將連接字符串傳入SqlConnection對象的構造函數中
 SqlConnection mySqlConnection = new SqlConnection(connectionString);
 using (mySqlConnection) ;
 {
 //打開連接
 mySqlConnection.Open();
 //利用label控件顯示mySqlConnection對象的ConnectionString屬性
 lblInfo.Text = "mySqlConnection對象的ConnectionString屬性爲:" +
 mySqlConnection.ConnectionString + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的ConnectionTimeout屬性爲:" +
 mySqlConnection.ConnectionTimeout + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的Database屬性爲:" +
 mySqlConnection.Database + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的DataSource屬性爲:" +
 mySqlConnection.DataSource + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的PacketSize屬性爲:" +
 mySqlConnection.PacketSize + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的ServerVersion屬性爲:" +
 mySqlConnection.ServerVersion + "<p></p>";
 lblInfo.Text += "mySqlConnection對象的當前狀態爲:" +
mySqlConnection.State + "<p></p>";
 }

 lblInfo.Text += "<p></p>關閉連接後的mySqlConnection對象的狀態爲:";
 lblInfo.Text += mySqlConnection.State.ToString();
  }
}

      程序代碼說明:在上述範例的程序代碼中,採用using(mySqlConnection)的形式使得代碼更加簡潔,並且其最大的優點就是無需編寫finally區塊代碼,可以自動關閉與數據庫的連接。

  

   連接池 

  打開與關閉數據庫都是比較耗時的。爲此,ADO.NET自動將數據庫連接存放在連接池中。連接池可以大幅度提高程序的性能和效率,因爲我們不必等待建立全新的數據庫連接過程,而是直接利用現成的數據庫連接。注意,利用Close()方法關閉連接時,並不是實際關閉連接,而是將連接標爲未用,放在連接池中,準備下一次複用。
  如果在連接字符串中提供相同的細節,即相同的數據庫,用戶名,密碼等等,則可以直接取得並返回池中的連接。然後可以用這個連接訪問數據庫。
  使用SqlConnection對象時,可以在連接字符串中指定max pool size,表示連接池允許的最大連接數(默認爲100),也可以指定min pool size表示連接池允許的最小連接數(默認爲0)。下面的代碼指定了SqlConnection對象的max pool size爲10,min pool size爲5。

SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Stdent;
integrated security=SSPI;"+"max pool size=10;min pool size=5");

<span style="font-size:18px;">程序代碼說明:在上述範例的程序代碼中,程序最初在池中生成5個SqlConnection對象。池中可以存儲 最多10個SqlConnection對象。如果要打開新的SqlConnection對象時,池中的對象全部都在使用中,則請求要等待一個 SqlConnection對象關閉,然後纔可以使用新的SqlConnection對象。如果請求等待時間超過ConnectionTimeout屬性指定的秒數,則會拋出異常。

  下面通過一個程序來顯示連接池的性能優勢。在應用此程序過程我們要先引用System.Data.SqlClinet和System.Text命名空間。</span>

 範例程序代碼如下:</span><pre name="code" class="sql">public partial class _Default : System.Web.UI.Page 
 {
 protected void Page_Load(object sender, EventArgs e)
 {
 //設置連接池的最大連接數爲5,最小爲1
 SqlConnection mySqlConnection =new SqlConnection(
 "server=localhost;database=Northwind;integrated security=SSPI;"+
 "max pool size=5;min pool size=1");
 //新建一個StringBuilder對象 
StringBuilder htmStr = new StringBuilder("");
for (int count = 1; count <= 5; count++)
{
 //使用Append()方法追加字符串到StringBuilder對象的結尾處
 htmStr.Append("連接對象 "+count);
 htmStr.Append("<br>");
 //設置一個連接的開始時間
DateTime start = DateTime.Now;
mySqlConnection.Open();
 //連接所用的時間
 TimeSpan timeTaken = DateTime.Now - start;
 htmStr.Append("連接時間爲 "+timeTaken.Milliseconds+"毫秒");
 htmStr.Append("<br>");
 htmStr.Append("mySqlConnection對象的狀態爲" + mySqlConnection.State);
 htmStr.Append("<br>");
 mySqlConnection.Close();
 }
 //將StringBuilder對象的包含的字符串在label控件中顯示出來
 lblInfo.Text = htmStr.ToString();
 }
 }
程序代碼說明:在上述範例的程序代碼中,我們將在連接池中重複5次打開一個SqlConnection對象,DateTime.Now表示當前的時間。 timeTaken表示從連接開始到打開連接所用的時間間隔。可以看出,打開第一個連接的時間比打開後續連接的時間要長,因爲第一個連接要實際連接數據庫。被關閉之後,這個連接存放在連接池中。再次打開連接時,只要從池中直接讀取即可,速度非常快。

  提示:String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要爲該新對象分配新的空間。在需要對字符串執行重複修改的情況下,與創建新的 String 對象相關的系統開銷可能會非常昂貴。如果要修改字符串而不創建新的對象,則可以使用 System.Text.StringBuilder 類。例如,當在一個循環中將許多字符串連接在一起時,使用 StringBuilder 類可以提升性能。Append 方法可用來將文本或對象的字符串表示形式添加到由當前 StringBuilder 對象表示的字符串的結尾處。

  執行結果:


ASP.NET 2.0中連接字符串的設置 

  在ASP.NET 2.0中,使用了一種在運行時解析爲連接字符串值的新的聲明性表達式語法,按名稱引用數據庫連接字符串。連接字符串本身存儲在 Web.config 文件中的 <connectionStrings> 配置節下面,以便易於在單個位置爲應用程序中的所有頁進行維護。

  範例程序代碼如下:

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="Pubs" connectionString="Server=localhost;
Integrated Security=True;Database=pubs;Persist Security Info=True"
providerName="System.Data.SqlClient" />
<add name="Northwind" connectionString="Server=localhost;
Integrated Security=True;Database=Student;Persist Security Info=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<pages styleSheetTheme="Default"/>
</system.web>
</configuration>

程序代碼說明:在上述範例的程序代碼中,我們在Web.Config文件中的<connectionStrings>配置節點下面設置了兩個數據庫連接字符串,分別指向pubs和Northwind兩個示例數據庫。注意,在2.0中引進了數據源控件,例如 SqlDataSource 控件,我們可以將SqlDataSource 控件的 ConnectionString 屬性被設置爲表達式 <%$ ConnectionStrings:Pubs %>,該表達式在運行時由 ASP.NET 分析器解析爲連接字符串。還可以爲SqlDataSource 的 ProviderName 屬性指定一個表達式,例如 <%$ ConnectionStrings:Pubs.ProviderName %>。其具體的用法和新特徵將在以後的章節進行詳細的介紹。現在有個基礎的瞭解即可。

  當然,我們也可以用下面的方式從配置文件直接讀取數據庫連接字符串。首先我們需要引用using System.Web.Configuration命名空間,該命名空間包含用於設置 ASP.NET 配置的類。

string connectionString =ConfigurationManager.ConnectionStrings["Student"].ConnectionString;

程序代碼說明:在上述範例的程序代碼中,我們可以利用ConnectionStrings["student"]讀取相應的student字符串。同理以可以利用ConnectionStrings["Pubs"]讀取相應的Pubs字符串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章