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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...