ado.net的簡單資料庫操作(一)

来源:https://www.cnblogs.com/CherishTheYouth/archive/2018/08/01/CherishTheYouth_801.html
-Advertisement-
Play Games

摘要:接下來的幾篇博客將要講到如何使用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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C 多線程編程系列(二) 線程基礎 [TOC] 1.1 簡介 線程基礎主要包括線程創建、掛起、等待和終止線程。關於更多的線程的底層實現,CPU時間片輪轉等等的知識,可以參考 一書中關於進程和線程的章節,本文不過多贅述。 1.2 創建線程 在C 語言中,創建線程是一件非常簡單的事情;它只需要用到 命名 ...
  • 作為一個獨立開發者產品需要支付介面是挺麻煩的,支付寶微信都不對個人開放,註冊公司維護成本太高,市面上各種收款工具要麼手續費太高,要麼到賬很慢,體驗很不好。 看到 「小叮噹支付」 這個收款工具,挺有意思的。原理是監控手機微信、支付寶的二維碼掃碼支付到賬通知並回調開發者應用,通知開發者用戶的支付結果。 ...
  • 一、前言 上篇實戰完成後,沒想到會有那麼多的圈友給了那麼多的支持,甚至連只是作為代碼倉儲的git上也給了一些小星星,真的感覺很惶恐啊,哈哈哈,畢竟代碼寫的很爛啊。由於上一篇只是大概說了下項目,所以準備寫下這篇詳細說下自己對於獲取當前登錄用戶的設計與實現,原本準備上周末就完成的這篇,結果周六一起來,發 ...
  • 當你選擇電腦或者電子、自控等專業進入大學時,你本來還是有機會從事其它行業的,可你畢業時執迷不悟,仍然選擇了開發做為你的職業,真是自做孽不可活。不過,歡迎你和我一樣加入這個被其它人認為是風光無限的“白領”吧。 如果你不是特別的與人世隔絕,我想你一定看過金老先生的名著《笑傲江湖》吧,裡面有一門十分奇特 ...
  • 字元串: C#中$的用法: 是為了替代string.format();https://www.cnblogs.com/hilolin/p/9123970.htmlhttps://blog.csdn.net/kebi007/article/details/52612610語法糖: C#6.0: htt... ...
  • 概述 OLE,Object Linking and Embedding,即對象連接與嵌入。我們在設計程式時,OLE可以用來創建複合文檔,把文字、聲音、圖像、表格、應用程式等類型的信息組合在一起,在Word中,我們可以通過OLE來實現以上要素信息的組合。下麵的示例中將介紹如何通過C# 來操作Word中 ...
  • 簡介 繼承(封裝、多態)是面向對象編程三大特性之一,繼承的思想就是擯棄代碼的冗餘,實現更好的重用性。 繼承從字面上理解,無外乎讓人想到某人繼承某人的某些東西,一個給一個拿。這個語義在生活中,就像 家族繼承財產,爺爺將財產繼承給兒女,兒女在將財產繼承給子孫,有些東西可以繼承有些的東西只繼承給 某人。映 ...
  • 1.今天在部署IIS7應用程式的時候出現了這個錯誤,本以為是發佈的錯誤,其實不然,是IIS中所依賴的項沒有配置正確 2.選擇創建站點中對應的應用池 高級設置 啟用32位應用程式,然後把值改為true。 3.打開cmd命令進行安裝 如果映射存在,請檢查應用程式是否分配給了.NET Framework4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...