摘要:接下來的幾篇博客將要講到如何使用ado.net實現簡單的資料庫操作,包括增刪改等內容。首先會介紹基礎的資料庫操作,然後以一個實例來進行講解,這個實例會把一個數據表讀取到winform上,然後在winform上有一些按鈕和文本框,通過這些實現對資料庫里的內容的增刪改的操作。我個人比較菜,因此記錄... ...
摘要:接下來的幾篇博客將要講到如何使用ado.net實現簡單的資料庫操作,包括增刪改等內容。首先會介紹基礎的資料庫操作,然後以一個實例來進行講解,這個實例會把一個數據表讀取到winform上,然後在winform上有一些按鈕和文本框,通過這些實現對資料庫里的內容的增刪改的操作。我個人比較菜,因此記錄計較詳細,說話也啰嗦,因此可能會寫幾篇才能介紹完。
本人屬菜鳥一枚,剛接觸.net兩個星期,寫的東西也是照搬自己看的視頻里老師教的東西,其目的主要是為了鞏固自己學習,當然,如果正好能幫助到和我一樣的剛入門的菜鳥,那我也是非常高興的。閑言少敘,那麼我就開始了。
昨天寫了一篇關於最簡單的三層的隨筆,但是,對於裡面的資料庫的操作只用了一個SqlHelper就一筆帶過了,至於這個SqlHelper是怎麼實現的,可能很多剛接觸.net一兩天的同學還是蒙圈的,所以今天借這個實例,詳細的說一下ado.net的簡單資料庫操作。啊?什麼?你想問複雜的。抱歉,想問複雜的請走開,為什麼?因為我也不會!
下麵我正式開始了,哈哈!
第一部分:連接資料庫
1.先說一下連接資料庫的基本步驟哈:
(1)創建連接字元串:
創建連接字元串有兩種方法,分別適用於登錄資料庫的不同方式,我這裡說的是我用的sqlserver資料庫哈,其他的資料庫應該也差不多吧,我沒試過,哈哈!
第一種:windows方式登錄
這種方式應該這麼寫:
string constr = "Data Source = acer-pc; Initial Catalog = 資料庫名;Intergrated Security = true";
什麼?你還不知道啥是windows的登錄方式,好吧,當你用這張圖登錄的時候,你就是windows登錄方式:
第二種:sql賬號登錄(通常用的都是 sa 賬號登錄的)
這種方式就這麼寫
string constr = "Data Source = acer-pc; Initial Catalog = 資料庫名; UserID = sa(賬戶用戶名) Passqord = 168168(密碼)";
其中,Data Source 後面寫的是你資料庫的地址,你連的是那個資料庫,本機的話,這裡寫 localhost\127.0.0.1\伺服器名稱(上圖中的第二個框里的內容)\或者直接打個點(.),這幾種寫法都可以;Initial Catalog 後寫資料庫的名字就可以了,再後面的就能看懂了吧。
(2)創建連接對象
創建連接對象需要用到這個東東 ==》 SqlConnection (這個類的空間沒引進來,需要shift + alt + f10 引入),怎麼寫?看下麵
1 using (SqlConnection con = new SqlConnection(constr)) 2 { 3 4 }
con 就是連接對象了。
(3)打開連接
(4)資料庫操作
(5)關閉連接,釋放資源
直接看代碼吧:
using (SqlConnection con = new SqlConnection(constr)) { con.Open();//打開連接 Console.WriteLine("打開連接成功"); con.Close();//關閉連接 }
可以新建一個控制台程式,在主函數里寫上這段代碼試一下,這是我的代碼和結果:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ado801am_ConnectSql { class Program { static void Main(string[] args) { string conStr = "Data Source = acer-pc;Initial Catalog = FirstDB;Integrated Security = true"; using (SqlConnection con = new SqlConnection(conStr)) { con.Open(); Console.WriteLine("連接成功"); con.Close(); } Console.ReadKey(); Console.WriteLine("關閉連接"); } } }
第二部分、資料庫操作
資料庫操作部分接在上面的第四步,這裡又細分了幾步,看下麵:
1.編寫sql語句
這是啥意思呢,其實就是先寫個sql = "XXX",比如,你要查詢某個表中的全部內容,那你就要寫:
string sql = "select * from TbXXX表";
就這。
2.創建一個執行sql語句的對象
這個和創建連接對象一回事,要用到一個這 ==》SqlCommand (這個類的空間沒引進來,需要shift + alt + f10 引入),怎麼寫?還是看下麵:
using (SqlCommand cmd = new SqlCommand(sql,con))//兩個參數 { }
這裡是兩個參數哈,不要搞錯了。
3.執行sql語句
咋執行啊?調用SqlCommand 里的方法呀!
至於這裡有幾個方法可以調用,那就要詳細講一下了,趁我自己還記得住,趕快記載下來,哈哈,別哪天突然忘了,畢竟看視頻的時候沒做筆記。
這裡有三個方法可用,分別是:
(1)ExecuteNonQuery():這個方法怎麼用呢,執行所有的sql語句都能用嗎?顯然,不能夠啊。這個方法啊,他執行後會給你返回一個 int 類型的值(也就是一個整數),那這個整數代碼表啥意思啊,這個整數代表的意思是:你的sql語句對這個表的內容改變的行數;比如啊,你向XXX表中插入了三條記錄,那麼這哥們兒就給你額返回個整數 3 ,你改變了表中的兩條數據,這哥們就給你扔個 2 ,你刪除了10條數據,他就給你個 10 ,但是啊,你要是執行查數據的操作,他給你個啥呢?比如:你要查一個名字叫 ChrishTheYouth 的人,那他給你啥呢,答案是: -1 ,為啥?因為,這表中的數據沒變化啊,半行都沒變化,指望他給你個啥呢!所以,我們在執行增、刪、改的sql語句時才能使用這個方法,查的操作就只能藉助下麵兩個方法了。
(2)ExecuteScalar();這個書上是這麼寫的 ==》返回的是一個 對象(object)類型,返回結果集中的 第一行第一列 的值,什麼意思?我的理解是這樣的,比如你查一個表裡面有沒有某個人,如果查到了,他就返回這個人所在這一列的第一個欄位的值(通常是id之類的),所以啊,這條語句多用於你查的內容只有那麼一條,比如登錄的時候,你查某個人在不在表裡,結果查出來這個人這一列,那他就返回這一列的這個id給你。
舉個例子,看這條sql語句:
select count(*) from TbAreas
這條語句在資料庫查到的內容是這樣的,看圖:
我們用ExecuteScalar()就獲得了查詢結果的第一行第一列,也就是這個54;
再看一個:
select * from TbAreas where TbAreas.areaName = '天津市'
查詢結果是:
而用ExecuteScalar()返回到的就是這個areaId.這麼講應該就懂了吧。在看看第三個:
(3)ExcuteReader():上一個講的是,當查詢單個記錄時使用的方法,那麼如果我要查詢一個表中所有的數據,還要把他顯示出來,該怎麼辦呢?哈哈,那就要用到這裡的ExcuteReader()方法啦。這個方法返回的是個類型化的DataReader對象,你查的時候,不管查到了啥,都給你返回個DataReader,但是,別以為這個DataReader裡面有數據,這裡啥也沒有??啊?啥也沒有,那你返回這個給我幹啥?別急,聽我講,其實啊,你查詢的內容都在資料庫的記憶體里存著在,但是這個裡面的內容你怎麼拿呢?就通過DataReader來拿,這個DataReader啊,它不是一個袋子,在裡面裝東西,它不是袋子,他是一個人,是一個幫手,是一個紐帶,你只能通過這個東西的幫忙,才能把你查詢的數據從資料庫記憶體里拿過來。這麼說,應該懂了吧。啥??還不懂,那我也沒轍了,推薦看看這個博客:http://www.cnblogs.com/net515/archive/2012/06/14/2549267.html
上面就是資料庫操作的三個方法啦。接下來,我想講一下,這個比較複雜的ExcuteReader()是怎麼用的,主要是加深自己的理解和印象吧。
ExcuteReader()的用法:
還是寫一個實例,結合一個簡單實例來說怎麼使用這個東西,怎麼查數據,怎麼把查到的數據取出來。先看代碼:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ado801am_ConnectSql { class Program { static void Main(string[] args) { string conStr = "Data Source = acer-pc;Initial Catalog = FirstDB;Integrated Security = true";//資料庫連接字元串 using (SqlConnection con = new SqlConnection(conStr)) //連接資料庫實例 { string sql = "select * from TbClass";//sql語句字元串 using (SqlCommand cmd = new SqlCommand(sql,con)) //執行sql語句實例 { con.Open();//打開資料庫連接 using (SqlDataReader reader = cmd.ExecuteReader()) { //查詢返回的結果是一個SqlDataReader類型對的對象,這個對象就是reader //判斷查詢結果中是否有數據 if (reader.HasRows) //reader.HasRows的返回值是bool類型變數,有數據則返回true,無數據則返回false { while (reader.Read()) //reader.Read()把游標讀取的游標放在表的第一行,然後每迴圈一次,向下移動一行,直到遍歷完所有行,返回false { for (int i = 0; i < reader.FieldCount; i++) { Console.Write(reader[i] + " "); } Console.WriteLine();//換行 } Console.ReadKey(); } else { Console.WriteLine("未查到任何數據"); } } } } } } }
然後看一下結果和表裡的內容是否一致:
顯然,查詢結果是一致的。
下麵具體說一下這個程式里幾個點:
(1)reader.HasRows:這個方法的功能就是先看看資料庫中有沒有查詢到你需要的數據,有就返回true,沒有就返回false;
(2)reader.Read():這個方法就相當與一個指針,它最開始指向第一行,然後依次向後移動,迴圈一次移動一次,指到那一行,你就可以讀那一行的數據,指導所有行都指完了,它就返回一個false,然後退出這個迴圈。
(3)reader.FieldCount:這個東西的作用是 ==》獲取當前行中的列數;
上面的實例中,也可以不用for迴圈去取某個行中的各個數據,而是直接把每個每個位置的數據取出來,這樣做的話需要指導每個列的數據類型,如下所示:
while (reader.Read()) { Console.Write(reader.GetInt32(0) + " "); Console.Write(reader.GetString(1) + " "); Console.Write(reader.GetString(2) + " "); Console.WriteLine();//換行 } Console.ReadKey();
運行結果如圖:
這種reader.GetXXX()的寫法有一個問題需要註意,那就是如果數據表中的數據為null,那麼就會報出異常,因此在使用這個的時候需要對是否為空進行一個判斷,判斷方法如下:
Console.Write( reader.IsDBNull(2)?"NULL" : reader.GetString(2));
先判斷是否為null,如果為null,則輸出NULL,如果不為null,則輸出存在的那個值,我修改了剛纔的表,是其中有幾個值為空,然後分別看看查詢的結果:
資料庫中的表:
A、添加了null校驗的結果
B.不添加校驗的結果:
好了,關於ado.net資料庫的操作今天就說到這裡啊,剩下的晚上再寫啊。
寫的東西比較淺,沒什麼含量,太菜了,有什麼失誤的地方,希望看到的同學可以留言告知,謝謝!
QQ:3074596466