ADO.NET(內涵效率問題)


ADO.NET

為什么要學習ADO.NET呢?

之前我們所學只能在查詢分析器里查看數據,操作數據,我們不能讓普通用戶去學sql,

所以我們搭建一個界面(Web Winform)讓用戶方便的操作數據庫中的數據

什么是ADO.NET?

ADO.NET就是一組類庫,這組類庫可以讓我們通過程序的方式訪問數據庫,就像System.IO下的類用類操作文件一樣, System.Data.這組類是用來操作數據庫(不光是MSSql Server),它提供了統一的編程接口讓操作其它數據庫(Access、Oracle等)的方式和操作MSSql Server一致.

 

  連接數據庫最重要的三個語句:

數據提供程序(常用類)

Connection,用來連接數據庫

Command,用來執行SQL語句

DataReader只讀、只進的結果集,一條一條讀取數據(StreamReader、XmlReader微軟的類庫中這些Reader的使用方式都差不多)

 

  除了上面三個還有:

DataAdapter,一個封裝了上面3個對象的對象。

 

  接下來一個問題就是我們讀取出來的數據存到什么地方呢?

數據集(DataSet),臨時數據庫。

斷開式數據操作

 

ADO.NET中的其他常見類

ConnectionStringBuilder//自動生成連接字符串(連接的時候需要一些基本的信息,就通過這個給傳過去)

Parameter//帶參數的SQL語句

Transaction//在ADO.NET中使用事務

與DataSet相關的類:

DataView//視圖類,DataTable中的數據以不同的視角查看

DataRowView//DataView中的行。

DataTable //DataSet中的數據表

DataRow//DataTable中的行

DataColumn//DataTable中的列

DataRealation//DataTable與DataTable的關系

Constraint//DataTable中建立的約束

 

一、Data Source

 

二、理解連接數據庫過程

馬上就說記不住怎么辦?

  上面的代碼只是讓大家理解,以后沒必要寫那么多。

 

三、連接數據庫簡化寫法

步驟一:聲明一個字符串

步驟二:一般數據庫用完要關閉並釋放其資源。

 

  再次簡化的代碼,dispose()沒有必要每次這樣調,用using默認幫我們調了。

 

四、連接數據庫最終簡化的代碼

 

 

五、dispose方法用反編譯器查看

 

六、連接數據庫需要注意的地方

連接對象當中有個事件:con.StateChange通過這個事件每次就能捕獲連接狀態的改變。下面看下它的具體的用法:

 

七、事件con.StateChange

  連接字符串的設置方法:

 

八、連接字符串屬性的設置方法

  如果沒有這個工具,我們怎么生成這個字符串呢?就是用SqlConnectionStringBuilder

具體演示如圖所示:

 

九、用SqlConnectionStringBuilder寫連接字符串屬性

能不能自己做一個小的連接字符串的生成工具呢?用這個類非常的容易,一下子就做好了。

 

十、連接字符串的生成工具

  建議還是把常規字符串的寫法記下來。

  上面我們已經把數據庫連上了,還沒有對其進行操作.下面我們說說第二個對象Command

 

  完成連接數據庫並且向里面插入一條記錄:

  在數據庫當中選擇一張簡單的表,建立winForm界面,點擊按鈕.插入數據.

 

十一、向數據庫中插入一列

  盡量晚打開,早關閉。用這個資源的時候,不到萬不得以不要打開。在這里有個連接池的問題。后面詳細講解。

 

十二、向另一個數據庫中插入一條數據

 

十三、刪除數據庫中一條記錄

 

十四、更新數據庫當中的一條數據

  小結:剛才我們對數據庫進行了增,刪,改,代碼幾乎一樣,只有sql語句不一樣。都是創建連接對象,sql語句,創建另一個對象,打開,執行,關閉。

   接下來我們看看查詢。

 

十五、查詢數據庫中的數據的代碼

 

十六、查詢數據輸出結果過程

  我們可以試着用軟件練習一下上面剛講解的內容,對容易出現錯誤的地方,我進行了統計。馬上總結一下。

  1. 連接字符串的時候出現的問題:寫計算機名,具體到自己寫的時候,看這。

 

十七、查看數據庫連接的計算機名

  1. 寫數據庫名稱的地方寫成了表名
  2. 由於sql語句寫錯報的錯。

怎么調呢?插入的時候報錯

 

十八、插入的時候報錯這樣處理

  在代碼中有con.Open();

            Int r=cmd.ExecuteNonQuery();

  按道理來講應該加上try catch,可能會出現斷網等現象。

但是,這里加上沒法顯示出錯誤。這里要是加上的話,后面也要拋出來。

   總而言之一般在ado.net中遇到的錯誤:

  1. 連接字符串問題
  2. Sql語句問題

 

十九、ExecuteScalar()方法

  StatementCompleted事件,每條SQL語句執行完畢之后觸發。

  多條語句同時執行(用分號隔開),如何獲取每條語句所影響的行數?

實際返回值為每條語句所影響的行數的和。

ExecuteScalar()方法除了能執行上面聚合函數的問題,請執行插入一條語句,獲取剛剛插入這條語句的返回值編號。

 

二十、執行查詢語句返回自動編號首界面

 

二十一、執行查詢語句返回自動編號代碼部分

  所以,ExecuteScalar()不光是能執行count(*)聚合函數的問題,任何的返回單條語句都可以使用。

  常用的三個方法:

 ExecuteNonQuery() 執行對數據庫的增刪改,返回受影響的行數,適合:insert、delete、update(對於其他語句返回-1)

ExecuteScalar()執行查詢,返回首行首列

ExecuteReader() 執行查詢,返回DataReader對象

 

  還記得我們上面剛做的查詢的例題么?下面通過這張圖說明一下原理:

 

二十二、DataReader

 

  下面我們再說說通過DataReader獲取列中數據時的問題:

 

二十三、通過索引器reader[ ]和使用reader.GetValue

 

二十四、通過索引器reader[ ]和使用reader.GetValue代碼

  很多的時候我們不想做類型轉換了,這個時候怎么辦呢?請看下面的辦法。

 

二十五、通過reader獲取強類型的數據

 

SqlDataReader使用注意的地方

數據庫中的類型與C#的不太一樣,數據庫中的float,得用C#的GetDouble( )來獲取。

 

二十六、空值的處理判斷

 

二十七、獲取多個結果集的數據

  接下來我們再通過SqlDataReader做個小的案例。

 

二十八、登錄首界面

查一條小技巧:

 

二十九、操作技巧,轉換成一行

 

三十、登錄案例代碼

  完成當用戶登錄失敗了提示是用戶名錯了,還是密碼錯了。怎么做呢?思考一下。

下面看下Ado.net連接池相關

 

三十一、沒啟用連接池的情況

 

三十二、啟用連接池的情況

我們發現啟用連接池以后的速度相當的快。

下面我們用工具看下,啟用,沒啟用狀態下數據庫內部做了什么東西。

先告訴大家SQL中有這么一個功能:

 

三十三、監視連接池內部的情況

 

三十四、這種情況下又打開了一個連接

2.什么情況下才會使用池中的連接對象?

  1>當上一個連接對象調用Close()方法后,才會將連接放入池中。

  2>當再次創建連接對象時,只有當本次創建連接對象所使用的連接字符串與池中現有連接對象的連接字符串完全一致時,才會使用池中的連接對象。

 

三十五、池可以通過連接字符串配置

  3.連接池中的連接對象的數量可以通過設置連接字符串來設置。

  4.池中的連接對象的銷毀由系統決定。

Ado.net連接池使用總結:

1.第一次打開連接會創建一個連接對象。

2.當這個連接關閉時(調用Close()方法時)會將當前那個連接對象放入池中。

3.下一個連接對象,如果連接字符串與池中現有連接對象的連接字符串完全一致,則會使用池中的現有連接,而不會重新創建一個。

4.只有對象調用Close(),的時候才會放入池中,如果一個連接對象一直在使用,則下次再創建一個連接對象發現池中沒有,也會再創建一個新連接對象。

在池中的連接對象,如果過一段時間沒有被訪問則自動銷毀。

 

 

什么情況下需要禁用連接池?

一般都不禁用。尤其是asp.net之類的程序,n多個用戶頻繁訪問,但是大多數用戶訪問時采用的都是同一個連接字符串

但如果某個應用程序有多個客戶端,每個客戶端訪問時采用的都是各自的連接字符串,這時如果采用連接池,雖然每次打開連接的速度會變快,但是由於“池”的問題同時會保存多個打開的連接對象。

 

另外,需要注意的是在遞歸的時候盡量不要去訪問數據庫。

 

下面我們再看下剛才我們做的登錄的案例:

 

三十六、SQL注入攻擊

怎么解決注入攻擊的問題呢?

答案就是我們帶參數的SQL語句。

 

三十七、帶參數的SQL語句

 

作者近期文章列表:

C#基礎教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#基礎教程,無任何商業目的。
希望與更多的代碼愛好者交流心得,也請高手多多指點!!!)
三層 三層(一)
三層相關案例(及常見的錯誤)
三層實例(內涵Sql CRUD)
SQL數據庫 ADO.net 數據庫的應用圖解一
數據庫的應用詳解二
ADO.NET(內涵效率問題)
面向過程,面向對象中高級 面向過程,面向對象的深入理解一
面向過程,面向對象的深入理解二
面向對象的深入理解三
winform基礎 Winform基礎
winform中常用的控件
面向過程 三種循環的比較
C#中的方法(上)
我們常見的數組
面向對象 思想的轉變
C#中超級好用的類
C#中析構函數和命名空間的妙用
C#中超級好用的字符串
C#中如何快速處理字符串
值類型和引用類型及其它
ArrayList和HashTable妙用一
ArrayList和HashTable妙用二
文件管理File類
多態
C#中其它一些問題的小節
GDI+ 這些年我收集的GDI+代碼
這些年我收集的GDI+代碼2
HTML概述以及CSS 你不能忽視的HTML語言
你不能忽視的HTML語言2精編篇
你不能忽視的HTML語言3
CSS基本相關內容--中秋特別奉獻
CSS基本相關內容2
JavaScript基礎 JavaScript基礎一
jQuery jQuery(內涵: jquery選擇器)

 


免責聲明!

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



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