ADO.NET 學習筆記 入門教程


本文轉載自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63

 

這是本人在學習ADP.NET過程中所作的筆記,可作為ADO.NET入門或者復習的教程。
 
連接字符串:
DataSource=localhost; AttchDBFilename=|DataDirectory|\Database1.mdf; InitialCatalog=UserDate; Integrated Security=True
參數說明 :
Data Source 表示數據源,其值為服務器地址和實例名,如果是正式版則不用加 SQLEXPRESS ,如果是免費版,必須加上 SQLEXPRESS ,即連接本機可以寫成“ .\ SQLEXPRESS ”;
AttchDBFilename 表示附加數據庫,其值為附加數據庫的地址, DataDirectory 代表當前項目目錄下的 App_data 目錄,是數據庫的默認存儲路徑;
Initial Catalog 為數據庫,其值為當前連接所要連接的數據庫名稱
注:如果要使用 Sqlconnection 對象,必須導入 System.Data.Sqlclient 命名空間
 
ADO.NET 中的連接等資源都實現了 IDisposable 接口,可以使用 using 進行資源管理。也可以使用 try …… catch 語句塊括起來,但是 using 是最簡單的。
代碼語句:
using (SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True"))
{
        程序語句塊;
}

或者:

 

SqlConnection cnn = new SqlConnection();//創建SqlConnection對象的一個實例 cnn.ConnectionString = "Data Source=localhost;Initial Catalog=UserDate;Integrated Security=True";
cnn.Open();

 

注: using 的作用是及時的釋放資源,在花括號結束的時候,程序會自動釋放語句所申請的內存,以達到程序的最優。
 
一、通過 SqlCommand 對象執行 SQL 語句
SqlCommand 對象可以執行 SQL 語句完成對數據庫的增、刪、改、查等數據操作。在 SqlCommand 類中,最主要的屬性有 CommandText ,該屬性用於接收要執行的 SQL 語句,例如 cmd.CommandText = "INSERT INTOb1(name, company, position, shijian) VALUES(@Name, @Company, @Position,@Datetime)" ,除了 CommandText 屬性,主要還有 Connection 屬性,用來接收數據庫連接,還有 Transaction 屬性,用來接收事物。
其還有三個比較常用的方法,第一個是 ExecuteNonQuery() 方法,主要用來提交無查詢結果的 SQL 語句,如 UPDATE INSERT DELETE 等語句,其返回值為數據庫中被 SQL 語句影響的行數,第二個是 ExecuteReader() 方法,主要用來提交 SELECT 語句,返回值是一個數據流,里面是 SELECT 語句的查詢結果,可以用 SqlDataReader 對象來接收,然后調用其 Read() 方法來逐行讀出查詢結果。第三個是 ExexuteScalar() 方法,主要也是用來提交 SELECT 語句,但是其返回值是查詢結果的第一行第一列,所以適用於例如 COUNT 等聚合查詢。
 
二、 SQL 注入與參數化查詢
SQL 注入是通過特殊的 SQL 語句非法獲取數據庫的內容。為了保證系統不被黑客進行 SQL 注入攻擊,在 SqlCommand 執行 SQL 語句時,可以對提交的數據先進行參數化處理,參數化處理主要是通過 SqlCommand 對象的 Parameters 屬性的 Add 方法來完成,參數化處理有兩種方法,第一種既是在“執行 Insert 操作 ”中提到的,還有另外一種代碼如下:
cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
                cmd.Parameters.Add(new SqlParameter("Name", Name.Text));
                cmd.Parameters.Add(new SqlParameter("Company", Company.Text));
                cmd.Parameters.Add(new SqlParameter("Position", Position.Text));
                cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text)));
                cmd.ExecuteNonQuery();
注:以上的代碼中需要注意一點,在第一種代碼中,顯示的對各個參數的數據進行了定義,但是在上面這種代碼中,並未對參數進行數據定義,所以需要在提供數據時對數據進行適時的轉換,例如“ shijian ”在數據庫中定義為 DateTime 類型,但是其在文本框中獲得的為 string 類型,所以需要調用 DateTime Parse 方法對數據進行轉換,如果數據庫中的數據是 int 型,在賦值時也應進行相應的轉換。
 
三、執行 Insert 操作
首先,需要申明一個 SqlCommand 對象;
其次,用 SqlConnection CreateCommand() 函數,創建一個 SqlCommand 對象,然后將所要執行的 SQL 語句賦值給 SqlCommand CommandText 屬性;
最后,調用 SqlCommand 類的 ExexuteNonQuery() 方法,執行 CommandText SQL 語句。
代碼語句:
using(SqlCommand cmd = con.CreateComand())
{
        cmd.CommandText = “INSERT INTO b1(name, company, position) VALUES(“whh”, “UVGE”, “coder”)”;
cmm.ExecuteNonQuery();
}

或者:

 

using(SqlCommand cmd = con.CreateComand())
{
              //設置SQL語句
        cmm.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
        //創建參數,並定義其數據類型,要和數據庫中對應的字段保持相同
        cmm.Parameters.Add("@Name", SqlDbType.NVarChar);
        cmm.Parameters.Add("@Company", SqlDbType.NVarChar);
        cmm.Parameters.Add("@Position", SqlDbType.NVarChar);
        cmm.Parameters.Add("@Datetime", SqlDbType.DateTime);
        //設置參數的值,這些值來自前段的輸入信息
        cmm.Parameters["@Name"].Value = Name.Text;
        cmm.Parameters["@Company"].Value = Company.Text;
        cmm.Parameters["@Position"].Value = Position.Text;
        cmm.Parameters["@Datetime"].Value = Datetime.Text;
        //執行SQL語句
        cmm.ExecuteNonQuery();
}

 

注:
SqlCommand 類的 ExecuteNonQuery() 方法的返回值是當前執行的 SQL 語句影響的行數
 
四、執行 select 語句
首先,申明 SqlCommand 對象
其次,用 SqlConnection CreateCommand() 函數,創建一個 SqlCommand 對象,然后將所要執行的 SQL 語句賦值給 SqlCommand CommandText 屬性;
第三,調用 SqlCommand 類的 ExecuteReader () 方法,執行 CommandText SQL 語句。
第四,申明 SqlDataReader 對象,並用其承接 ExecuteReader () 方法所返回的數據流;
第五,用 SqlDataReader 類的 Read() 方法逐行讀取數據流中的逐句,取出其中所需要字段的數據進行處理
代碼語句:
using(SqlCommand cmd = con.CreateComand())
{
        Cmd.CommandText = “SELECT語句”;
        using(SqlDataReader reader = cmd.ExecuteReader())
{
While(reader.Read())
{
                String name = reader.GetString(reader.GetOrdinal(“name”));
                //數據處理語句塊;
        }
}
}

或者:

using(SqlCommand cmd = con.CreateComand())
{
        using(SqlDataReader reader = cmd.ExecuteReader())
{
While(reader.Read())
{
                String name = reader.[“name”].ToString();
                //數據處理語句塊;
}
}
}
注:
1、User是SQL SERVER的關鍵字,在表名中應盡量避免,如果必須是User表,可以用SELECT * FROM [User]這樣的語句來查詢該表的內容
2、SqlCommand 類的ExecuteScalar()方法返回的是查詢結果的第一行第一列的數據
3、在插入數據的同時想要獲得當前插入數據的id(主鍵)號,可以通過output語法和ExecuteScalar方法實現,這是在SQLSERVER 2005以后的版本中都有的,具體語法如下:
cmd.CommandText = “INSERT INTO T_Users(UserName,PassWord) OUTPUT inserted.Id Values(“admin”, “123456”)”;
int id = Convert.ToInt32(cmd.ExecuteScalar());
五、 using close
using 對實現了 IDisposable 接口的類進行了資源管理,只要在其作用域內 using 就會自動進行資源管理,當程序執行出了其作用范圍,程序會自動 close dispose 資源,保證資源的及時釋放和回收。而 Close 只是關閉了當前的連接或者資源,只要其后沒有 dispose ,還可以繼續 open 連接,即 close 並未釋放資源,只做了關閉處理,當 close dispose 連用時,和 using 作用相同,但考慮到異常處理等情況,所以最好使用 using ,少用 close dispose
 
六、通過數據集操作數據
數據集是最常用的訪問數據的方式,其主要流程是連接數據庫、進行數據查詢、將查詢結果填充到數據集、對數據集中的數據進行展示和操作、將操作后的數據集提交數據庫,通過這一系列操作實現對數據庫的修改,此過程主要通過 DataSet DataAdapter DataTable DataRow DataColumn SqlCommandBuilder 等類實現。
根據上面所說到過程,逐步分析:
1 、數據查詢,這里的數據查詢不再是通過 Command 對象實現,而是通過 DataAdapter 類的實例來實現,具體代碼如下:
SqlDataAdapter sqldadp = new SqlDataAdapter("SELECT name, company, position, shijian FROM [UserDate].[dbo].[b1] WHERE shijian > '2010-01-21'", con)
上面的代碼里面的 con SqlConnection 對象的實例,即數據庫鏈接
2 、將數據填充到數據集,數據集也就是 DataSet 對象的實例了,代碼如下:
DataSet order_daset = new DataSet();//創建DataSet對象實例
sqldadp.Fill(order_daset);//填充DataSet對象
注意填充語句中的參數以及方法,是用 SqlDataAdapter 對象的實例來填充 DataSet 對象的實例
3 、對數據集中的數據進行展示和操作,這步也是這項技術中最重要、最麻煩的一步,主要是通過 DataTable 對象的實例對數據進行展示和修改,而 DataTable 類具有很多的屬性和方法,常用的屬性有: Columns 能夠得到數據集中的字段的數據類型、大小、字段名等信息, DataSet 能夠獲得當前 DataTable 實例所屬的數據集, Rows 可以通過下標及字段名(類似於二維數組)的方式獲得指定行列的數據,常用的方法有: NewRow() 方法能夠創建一個空白行,可以在添加數據的時候使用, AcceptChanges() 方法能夠將數據表中修改提交給數據庫, Clear() 方法可以清楚 DataTable 對象中的所有數據。具體代碼如下:
DataTable dt = new DataTable();//創建數據表對象
dt = order_daset.Tables[0];//填充數據表
Response.Write("<table border='1'><tr><th>姓名</th><th>公司</th><th>職位</th><th>入職時間</th></tr>");
for (int i = 0; i < dt.Rows.Count; i++)
{
   //按照字段,逐行取出數據表中的內容並顯示在頁面上
   Response.Write("<tr>");
   Response.Write("<td>"+dt.Rows[i]["name"].ToString()+"</td>");
   Response.Write("<td>"+dt.Rows[i]["company"].ToString()+"</td>");
   Response.Write("<td>"+dt.Rows[i]["position"].ToString()+"</td>");  Response.Write("<td>"+DateTime.Parse(dt.Rows[i]["shijian"].ToString()).ToString("yyyy-MM-dd") + "</td>");
   Response.Write("</tr>");
}
Response.Write("</table>");

注:上面的代碼主要是數據集的展示功能,需要注意的是填充數據表的語句,是由DataSet對象的Tables屬性的下標為0的數據表填充的,這點是非常重要的。
下面來看看對數據集的修改並且提交數據庫,對數據集的修改,可以通過DataRow以及SqlCommandBuilder對象的實例來實現,SqlCommandBuilder的作用是根據DataAdapter對象自動生成INSERT、UPDATE、DELETE語句,從而使DataAdapter對象更新數據庫內容。具體代碼如下:

 

//創建DataAdapter對象實例
SqlDataAdapter sqldadp = new SqlDataAdapter("SELECT name, company, position, shijian FROM [UserDate].[dbo].[b1]", con);
SqlCommandBuilder scb = new SqlCommandBuilder(sqldadp);//生成插入、刪除、更新語句
DataSet ds = new DataSet();//創建DataSet對象
sqldadp.Fill(ds);//填充DataSet
DataRow Myrow = ds.Tables[0].NewRow();//在數據表中創建新的空白記錄對象
//從前台頁面接受要插入的數據
Myrow["name"] = Name.Text;
Myrow["company"] = Company.Text;
Myrow["position"] = Position.Text;
Myrow["shijian"] = Datetime.Text;
//將接收到的數據添加到DataTable中
ds.Tables[0].Rows.Add(Myrow);
//更新數據庫中的內容
sqldadp.Update(ds);
Response.Write("添加成功!<br>");

 

注:上面的代碼中最關鍵的一個方法是SqlDataAdapter對象的Update()方法,這個方法的作用是將對數據集所作的改變提交給數據庫,這部分代碼與上面的展示代碼所不同的是DataRow對象的實例所接收的是DataTable中的一行,而不是整個DataTable,其代碼為:DataRow Myrow =ds.Tables[0].NewRow(),這句話就是說在原有的DataTable的基礎上創建一個新的空行,而下面的代碼則是為這個空行賦值並提交更新,同樣的,如果是更新數據的話,也是獲得DataTable的某一行后,然后對其中的數據進行賦值修改,然后提交,如果是刪除操作,則是通過DataTable獲取某行后,用DataRow接受,然后再調用DataTableRows屬性的Remove方法刪除,具體如下代碼:

 

DataTable dt = ds.Tables[0];
dt.Rows.Remove(Myrow);

 

七、網絡數據的事務處理
事務處理是為了防止在網絡上多用戶對數據庫的並發操作破壞數據的一致性和完整性,而事務處理主要通過 SqlTransaction 對象完成,其主要的方法有: Commit() 方法主要負責提交事務處理完成真正的數據庫查詢更新操作, Rollback() 方法主要負責當數據查詢更新等數據庫操作出現異常時的事務回滾。 ADO.NET 的事務處理主要通過 SqlCommand 對象來實現事務對象,代碼如下:
using (SqlConnection con = new SqlConnection("Data Source = localhost; Initial Catalog = UserDate; Integrated Security = True"))
        {
   SqlTransaction transql = null;//申明SqlTransaction對象的實例
   SqlCommand cmd = new SqlCommand();
   try
   {
        con.Open();//創建數據庫鏈接
        transql = con.BeginTransaction();//開始事務處理
        cmd.Connection = con;//設置Command對象的鏈接
        cmd.Transaction = transql;//設置Command對象的事務
        //設置帶參數的SQL語句
        cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
        //為參數賦值(注意參數在數據庫中的數據類型)
        cmd.Parameters.Add(new SqlParameter("Name", Name.Text));
        cmd.Parameters.Add(new SqlParameter("Company", Company.Text));
        cmd.Parameters.Add(new SqlParameter("Position", Position.Text));
        cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text)));//注意數據類型轉換
        //執行SQL語句
        cmd.ExecuteNonQuery();
        //提交事務
        transql.Commit();
        Response.Write("添加成功!<br>");
    }
   catch
    {
        //如果程序拋出異常則做事務回滾
        transql.Rollback();
    }
}

注:在上面的代碼中,特別要注意SqlTransaction的實例接收的是SqlConnection實例的BeginTransaction()的返回值,SqlCommand的實例的Transaction屬性接收的是SqlTransaction的實例,即SqlConnection實例的BeginTransaction()的返回值,而整個事務的過程是由SqlCommand實例來書寫的,也就是說,在SqlCommand實例里面的代碼相對應的事務都由SqlTransaction的實例自動生成,前提是必須要有transql = con.BeginTransaction();cmd.Transaction= transql;這兩句代碼,最后用SqlTransactionCommit()方法或者Rollback()對事務進行提交或者回滾

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM