ADO.NET的對象主要包括Connection、Command、DataReader、DataAdapter、DataSet,ADO.NET訪問數據庫主要包括兩個步驟:建立數據庫連接、讀取或更新數據。
一、建立數據庫連接
Connection對象負責建立和控制用戶應用程序和數據庫之間的連接。所有的數據庫連接都要用到連接字符串,該字符串是使用分號隔開的多項信息,其內容隨着數據庫類型和訪問內容的變化而變化。
連接字符串的格式:"Server=服務器名或服務器IP地址;DataBase=數據庫名稱;User ID=用戶名;Pwd=密碼"
使用Connection對象連接SQL Server數據庫的方法如下:
using System.Data.SqlClient;引用namespace
......
SqlConnection con=new SqlConnection(連接字符串);
con.Open();
......
//數據庫相關操作
......
con.Close();
1. 在Web.config文件中配置與數據庫連接的字符串
<configuration>
<connectionStrings>
<add name="連接字符串名稱" connectionString="Data Source=服務器名或服務器IP地址;
Initial Catalog=數據庫名稱;Persist Security Info=True;User ID=用戶名;Password=密碼"
providerName="System.Data.SqlClient"/>
<add name="ConnectionString" connectionString="Server=127.0.0.1;database=FXT_XPX;uid=sa;pwd=zdwpZDWP123456" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
2. 在C#中獲取Web.config文件中的數據庫連接字符串
連接字符串=ConfigurationManager.ConnectionStrings["連接字符串名稱"].ToString()
二、讀取數據
當應用程序與數據庫建立好連接后,便可從數據庫的表中讀取數據,通常有兩種方法:一種是使用Command和DataReader對象,另一種是使用DataAdapter和DataSet對象。
1. 使用Command和DataReader對象讀取數據
DataReader對從SQL數據庫檢索的數據提供僅向前的只讀指針。由於DataReader類是抽象類,不能直接實例化,因此,如果要使用DataReader對象,需要先創建Command對象。Command對象的ExecuteReader方法將創建一個DataReader對象,該對象從數據庫中讀取由select命令返回的只讀、只進的數據流,且一次只讀取一條數據。
SqlCommand com=new SqlCommand(cmdstr,con);//使用指定的SQL命令和連接對象創建SqlCommand對象
SqlDataReader dr=com.ExecuteReader();//執行SQL語句,返回SqlDataReader對象
While (dr.Read())//循環讀取,每次讀取一條記錄
{
//循環體內語句,例如:string s=dr["column_name"].ToString();
}
dr.Close();
采取這種方式讀取數據時,內存中只有一行內容,所以不僅提高了應用程序的性能,還有助於減少系統的開銷。采用DataReader對象讀取數據的方式適用於下列情形:
- 不需要緩存數據;
- 要處理的結果太大,內存中放不下;
- 需要以僅向前、只讀方式快速訪問數據;
DataReader對象的局限性有以下3點:
- 只能向前循環讀取數據;
- 只能讀取數據,不能修改數據;
- 只能處理一個表的數據;
注意:DataReader在使用時,將以獨占方式使用Connection。也就是說,在用DataReader讀取數據時,與DataReader對象關聯的Connection對象不能再為其他對象所使用。因此,在使用完DataReader后,應顯式調用DataReader的Close()方法斷開和Connection的關聯。
2. 使用DataAdapter和DataSet對象讀取數據
DataAdapter是DataSet與數據庫之間的溝通媒介,DataAdapter打開一個連接並執行指定的SQL命令,將獲取的數據填充到DataSet。也可以將DataSet中的數據更新到數據源中。DataAdapter對象常用方法有:1. Fill()從數據源獲取數據填充DataSet;2. Update()將DataSet中的數據更新到數據源。
DataSet是數據在內存中的緩存,相當於在內存中的一個小型關系數據庫,與數據源是斷開的。DataSet的結構和關系型數據庫很類似,具有表、行、列等屬性。它主要用於在內存中存放數據,可以一次讀取整張數據表的內容。
DataSet對象可以存放DataAdapter對象執行SQL命令后所取得的數據。DataSet也是一個集合對象,一個DataSet對象包括一組DataTable對象和DataRelation對象,應用程序可以通過DataTable對象和DataTable對象內的DataColumn對象、DataRow對象的操作讀取數據。
SqlDataAdapter da=new SqlDataAdapter(cmdstr,con);//使用指定的SQL命令和連接對象創建SqlDataAdapter對象
DataSet ds=new DataSet();//創建DataSet對象
da.Fill(ds,"table_name");//使用SqlDataAdapter的Fill方法填充DataSet,並創建一個名為“table_name”的DataTable對象,將數據存放其中
DataSet讀取數據的過程如下:
1. 創建連接
2. 創建DataAdapter對象
3. 創建DataSet對象
4. 執行DataAdapter對象的Fill()方法
5. 將DataSet中的表綁定到數據控件中
DataReader讀取數據的過程如下:
1. 創建連接
2. 打開連接
3. 創建Command對象。
4. 執行Command的ExecuteReader()方法
5. 將DataReader綁定到數據控件中
6. 關閉DataReader
7. 關閉連接
DataAdapter的Fill方法會自動檢查數據庫連接是否打開,如果沒有打開,則先自動調用Open()方法打開連接,再執行填充操作,在數據填充結束后,會自動調用Close()方法關閉數據庫連接。因此無須在代碼中添加Open()和Close()方法。
使用Command對象時,需要手工添加Open()方法以打開數據庫的連接,最后還需要添加Close()方法關閉連接。
三、更新數據
數據更新是指對數據進行添加、刪除和修改等操作。數據更新通常有兩種方法:1、使用DataAdapter對象,2、使用Command對象。
1. 使用DataAdapter對象更新數據
通過DataAdapter對象將數據填充到DataSet后,便可對DataSet中的數據進行修改、添加和刪除操作,然后再將DataSet中的數據更新回數據庫。
SqlDataAdapter da=new SqlDataAdapter(cmdstr,con);
DataSet ds=new DataSet();
da.Fill(ds,"table_name");
SqlCommandBuilder cb=new SqlCommandBuilder(da);//綁定SqlDataAdapter對象,自動生成從DataSet更新SQL Server的SQL命令
//更新DataSet對象的數據,例如:
ds.Tables["table_name"].Rows[0]["column_name"]=abc;//修改數據
//添加數據
//刪除數據
da.Update(ds,"table_name");//將DataSet的數據更新回SQL Server數據庫
注意:DataSet中的數據必須至少存在一個主鍵列或唯一的列。如果不存在主鍵列或唯一列,調用Update()時將會產生InvalidOperation異常,不會生成自動更新數據庫的Insert、Update或Delete命令。
2. 使用Command對象更新數據
四、使用Command對象實現數據庫的事務處理
事務是一組由相關任務組成的單元,該單元中的任務要么全部成功,要么全部失敗。事務最終執行的結果只能是兩種狀態,即提交或終止。
在事務執行的過程中,如果某一步失敗,則需要將事務范圍內所涉及的數據更改恢復到事務執行前設置的特定點,這個操作稱為回滾。例如,用戶如果要給一個表中插入10條記錄,在執行過程中,插入到第5條時發生錯誤,這時便執行事務回滾操作,將已經插入的4條記錄從數據表中刪除。
以下代碼是ASP.NET應用程序實現事務處理的示例,代碼向數據庫添加記錄,並使用try...catch語句捕捉異常,當出現異常時,執行事務回滾操作。
Public Void Insert(Int ID)
{
con.Open();
string cmdstr="insert into table_name(id) values("+ID+")";
SqlTransaction st=con.BeginTransaction();//調用SqlConnection對象的BeginTransaction()方法創建一個SqlTransaction對象
SqlCommand cmd=new SqlCommand(cmdstr,con);
cmd.Transaction=st;
try
{
cmd.ExecuteNonQuery();
st.Commit();//提交事務
con.Close();
}
catch
{
Response.Write("<script>alert('插入失敗,執行事務回滾')</script>");
st.Rollback();//執行事務回滾操作
}
}