Java進擊C#——語法之ADO.NET

来源:http://www.cnblogs.com/hayasi/archive/2016/10/10/5938714.html
-Advertisement-
Play Games

上一章講到關於C#語法的基礎部分。瞭解相關的基礎部分之後我們就要去瞭解一下C#是什麼樣子訪問數庫的。C#把訪問資料庫這一部分的知識點叫作ADO.NET。即是JAVA常常講到的JDBC這一部分的知識點了。筆者根據使用資料庫方式的不同又分為有線連接和無線連接(關於有線和無線的叫法是筆者個人定義的。因為看 ...


本章簡言

上一章講到關於C#語法的基礎部分。瞭解相關的基礎部分之後我們就要去瞭解一下C#是什麼樣子訪問數庫的。C#把訪問資料庫這一部分的知識點叫作ADO.NET。即是JAVA常常講到的JDBC這一部分的知識點了。筆者根據使用資料庫方式的不同又分為有線連接和無線連接(關於有線和無線的叫法是筆者個人定義的。因為看了不同的書裡面很多叫法)。不管是什麼樣子的叫法。只要明白有線是保持連接的狀態下操作資料庫。而無線是連接之後複製一份副本,關閉連接,對副本進行操作之後,在連接更新資料庫。筆者認為如果只是使用的話,只要瞭解對應的幾個相關的類就可以了。如果有搞研究的話,就是對他內部的一些機制進行學習了。那麼這裡只是講到如何使用。

 ADO.NET的概念

由於本系列並不是主講ADO.NET。所以這裡筆者只會教上面定義有線連接方式相關的類。不管如何讓我們先看一下ADO.NET類相關聯的所有基類吧。這樣子也方便我們下麵的學習。

下麵是ADO.NET的基類信息

DbConnection類:用於連接數庫的類。相當於JDBC裡面通過DriverManager.getConnection方法獲得Connection介面對應的實例類。

DbCommand類:用於存放數據源執行的 SQL 語句或存儲過程的類。相當JDBC裡面的Statement介面。

DbDataReader類:從數據源讀取行的一個只進流。即是執行SQL結果的存放地方。相當於JDBC裡面的ResultSet介面

DbParameter類:用於表示DbCommand裡面對應的參數。相當於JDBC裡面的PreparedStatement的填充參數一樣子。

DbParameterCollection類:不用看就知道DbParameter類的集合類。

DbTransaction類:用於事務的類。相當於JDBC裡面的conn.setAutoCommit(false)的功能。這個不會不清楚吧。

DbDataAdapter類:這個類常用於DataSet一起用。也就是說他是筆者上面定義的無線連接方式。

DbCommandBuilder類:用於協調 DataSet 的更改與關聯資料庫的單表命令。即是跟上面的DbDataAdapter類常常一起用。

DbConnectionStringBuilder類:用於生成連接字元串。

事實上ADO.NET所有的類都是基於上面的基類。想要使用ADO.NET的話,只要瞭解上面的基類就可以了。如果更深入的話,筆者也不清楚什麼做了。至於上面的基類C#把他們按類層次劃分為連接類和非連接類。如下麵筆者在網路上找到的一張圖片。我們就可以很清楚的知道哪一些是連接類,哪一些是非連類。

顯然連接就是連接數庫時用的類,非連接就是在沒有資料庫的情況相關類了。而上面筆者是根據操作資料庫模式進行劃分的。希望不要誤導各位的理解。上面左邊的方框裡面就是屬於連接類,右邊的方框是屬於非連接類。

連接類:DbConnection類、DbCommand類、DbTransaction類、DbParameter類、DbDataAdapter類

非連接類:DataTable類、DataRow類、DataRowCollection類、DataColumn類、DataColumnCollection類、DataRelation類、DataRelationCollection類

學習ADO.NET,事實上就是學習ADO.NET對應的類。有了我們對上面類的一定的瞭解之後。筆者只要自己動手寫一個小例子就可以理解和明白了。

ADO.NET的例子

筆者的資料庫用是SQL Server 2008。新建一個資料庫,筆者將他命名為Ado。在新建一個張表為Catalogs。如下SQL語句

表的SQL:

CREATE TABLE [dbo].[Catalogs](
    [ID] [int] NOT NULL,
    [CatalogName] [nvarchar](50) NULL,
    [CatalogCode] [nvarchar](50) NULL,
 CONSTRAINT [PK_Catalogs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

數據的SQL:

INSERT [Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (1, N'圖書', N'c0001')
INSERT [Catalogs] ([ID], [CatalogName], [CatalogCode]) VALUES (2, N'電腦', N'c0002')

好了。有了上面的數據和表之後,筆者就要簡單做一個獲得數據的例子來學習ADO.NET的知識。

一、首先我們要想辦法和資料庫發生關係。即是連接到資料庫。對JDBC來講第一步是載入對應資料庫驅動。相信下麵這段代碼做JAVA不可能不懂吧。可惜C#這邊卻好像沒有這一步。JDBC做了這一步之後才開始獲得對應的連接類實例。

JDBC的載入驅動:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

JDBC的獲得連接:

String url = "jdbc:sqlserver://localhost;databaseName=AAA";
Connection conn = DriverManager.getConnection(url,"sa","123");

至於ADO.NET卻沒有那麼複雜。直接實例化一個資料庫連接類就行了。如下的代碼

ADO.NET的獲得連接:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");

這裡筆者講一個小手段。相信JDBC在獲得連接字元串的時候,是一件很頭痛的事情。只能百度或死記。而C#這邊如果用的是SQL Server 的話。到是可以用VS的“伺服器資源管理器”視圖來獲得對應的連接字元串。

右擊圖上的“數據連接”》添加連接(A)

這個時候就是彈出一個讓你選擇要連接的資料庫信息。如圖下。

先在伺服器名的方框中填寫"."。然後在選擇使用WINDOW 或是 SQL SERVER。最後你就可以在“選擇或輸入資料庫名稱”中下拉選擇你所對應的資料庫了。這個時候點擊確定按扭就會在“伺服器資源管理器”視圖中“數據連接”下方多出一個連接。先擇右擊》屬性

點擊“屬性(R)”之後就會彈出對應的屬性窗體了。這才是我們最後需要的信息了。如圖下。看到連接字元串了沒有。就是他了。複製一下就可以了。只是密碼部分修改一下就可以了。因為他是******。這是不對的。

連接字元串對應的值:

Data Source=.;Initial Catalog=Ado;User ID=sa;Password=***********

SqlConnection類就是DbConnection類的子類。有心的讀者可能看出一些問題來。是不是說明一點:每一個不同的資料庫是不是對應的在Connection前面加上對應的關鍵字母呢?即是XxxConnection。Xxx可能會變。沒有錯。筆者想說一點就是這個。在JDBC裡面不同的資料庫會載入不同的驅動。如MySql就載入MySql的驅動。Sql Sever就是載入Sql Sever的驅動。只是C#這邊沒有對應的載入驅動的說法。事實上筆者認為有。只是變了而以。XxxConnection的Xxx便是最好的體現。

二、新建一個SQL命令。即是新建一個DbCommand類對應的實例類。這個部分相當JDBC的Statement stmt = conn.createStatement()了。

C#:

SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SELECT TOP 1000 [ID] ,[CatalogName] ,[CatalogCode] FROM [Ado].[dbo].[Catalogs]";
command.CommandType = System.Data.CommandType.Text;

SqlCommand類是DbCommand類的子類。這個筆者說了是白說。上面我們知道了DbCommand類的功能。SqlCommand類理解為用於存放SQL命令。同時用於觸發SQL命令的執行。首先讓我們看一下上面的代碼。其中Connection屬性和CommandText屬性相信大家都明白。如果只是存放SQL命令卻不給他對應的連接,他又什麼知道去哪裡查資料庫呢?所以有Connection屬性就知道去找哪個資料庫了,有CommandText屬性就是知道要對這個資料庫做什麼。而CommandType屬性是表示要做的SQL命令是什麼類型的。只是SQL語句,還是存儲過程,或是只直獲得表。(這裡的變數connection是上面代的connection一樣子)

C#:

 1 // 摘要: 
 2     //     指定如何解釋命令字元串。
 3     public enum CommandType
 4     {
 5         // 摘要: 
 6         //     SQL 文本命令。(預設。)
 7         Text = 1,
 8         //
 9         // 摘要: 
10         //     存儲過程的名稱。
11         StoredProcedure = 4,
12         //
13         // 摘要: 
14         //     表的名稱。
15         TableDirect = 512,
16     }

現在SqlCommand類對象實例知道了連接的資料庫,也知道要執行SQL命令。接下來便是生成對應的結果。即是執行。那麼在執行的時候,又會分了查詢和增刪改。這一點JDBC也有。Statement介面的executeQuery方法和executeUpdate方法就是最好的證明瞭。不用筆者多說了。同樣子,C#也一樣,只是方法名不一樣子而以。ExecuteReader方法就是相當於executeQuery方法。但記得ExecuteReader方法這邊一般是不用參數的。ExecuteNonQuery方法相當於executeUpdate方法。理解了這倆個方法就好辦了。在執行這倆個方法之前,我們還有做一件事情就是打開連接。代碼如下

C#:

connection.Open();//打開連接
SqlDataReader dr = command.ExecuteReader();//執行SQL命令

三、處理SQL命令的結果。即是利用SqlDataReader類來獲得對應的結果。JDBC中在獲得結果的時候,就是利用ResultSet介面。顯然倆者很類似。

C#:

SqlDataReader dr = command.ExecuteReader();//執行SQL命令
while (dr.Read())
{
      Console.WriteLine(string.Format("CatalogName:{0}  CatalogCode:{1}", dr[0], dr["CatalogCode"]));
}

dr.Close();
connection.Close();

跟JDBC真的很類似,其中dr.Read()就跟ResultSet介面的next()方法類似。而dr[0]和dr["CatalogCode"]跟ResultSet介面的getString()方法類似。註意在執行結束之後要關閉SqlDataReader類和SqlConnection類。讓我們看一下執行的結果吧。

上面筆者只做查詢的例子卻沒有做增刪改的例子。因為筆者相信對你們來是小事了。只要把SQL命令修改成增刪改的語句和ExecuteReader方法變成為ExecuteNonQuery方法。當然這時候就沒有返回SqlDataReader類的對象了。有的只是影響的行數而以。代碼如下

C#:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "UPDATE Catalogs SET CatalogName='小吃' WHERE ID =1";
command.CommandType = System.Data.CommandType.Text;
connection.Open();//打開連接

int affectCount = command.ExecuteNonQuery();
if (affectCount > 0)
{
      Console.WriteLine("修改成功");
}
else
{
      Console.WriteLine("修改失敗");
}

connection.Close();

上面是簡單的修改。只要讀者們自己組裝SQL語句就可以了。那麼有沒有跟JDBC的PreparedStatement介面功能一樣子的方式嗎。答案是有的。筆者就直接把代碼貼出。你們看一下就知道什麼用了。

C#:

SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Ado;User ID=sa;Password=123");
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "UPDATE Catalogs SET CatalogName=@CatalogName WHERE ID =@ID";
command.CommandType = System.Data.CommandType.Text;
connection.Open();//打開連接
command.Parameters.Add(new SqlParameter("@CatalogName", "小吃"));
command.Parameters.Add(new SqlParameter("@ID" ,1));

int affectCount = command.ExecuteNonQuery();
if (affectCount > 0)
{
      Console.WriteLine("修改成功");
}
 else
{
      Console.WriteLine("修改失敗");
}

connection.Close();

以上的內容主要是講了關於有線連接的方式。筆者上面就說過有倆種。一種是有線,一種是無線。關於無線更多是用到SqlDataAdapter類和DataSet類。希望讀者們自行研究。

本章總結

本章主要是講到ADO.NET的部分知識點。專對有線連接的部分知識。對於後面開發.NET來講會有一定會幫助。不過相信現在有很人不知道ADO.NET是什麼。更多都被ORM框架取代了。


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

-Advertisement-
Play Games
更多相關文章
  • 摘要:.NET中的枚舉分為簡單枚舉和標誌枚舉,這次主要總結一下標誌枚舉適用條件,以及它的使用方法,併在文章的最後列舉枚舉使用的一些規範。 在剛接觸.NET的枚舉時,只用簡單的枚舉,對於標記枚舉,只知道是在枚舉類型加上 特性,然後給枚舉值賦予十六進位的值,並且書中還特別明確規定值必須是以2的指數才可以 ...
  • 最近發現easyui時間控制項的值格式不支持帶斜杠的日期(2016/10/31),必須是2016-10-31這類的才能正常使用,否則預設初始化為當前時間 斜杠顯示異常:顯示的是當前系統日期 如上換成橫杠之後正常顯示: 如上,必須把value換成帶橫杠 的日期格式才能正常初始化,已測試過easyui1. ...
  • 說到 Microsoft Bot Framework 其實微軟發佈了已經有一段時間了,有很多朋友可能還不太瞭解,微軟Bot的功能今天我給大家簡單的介紹一下,Bot Framework的開發基礎以及如何使用Bot Framework和我們的一個現有的三方客服(例如一個微信的公共號)集成起來。 ...
  • 背景 本地環境:Win7,Visual Studio 2013, IIS 7.5 WebForm 項目,添加一個http介面給別人調用。 我的做法是添加了一個Controller,Application_Start 裡面添加路由。 然後本地測試通過。 發佈 發佈機器環境: Window Server ...
  • 目錄 1. ASP.NET 路由 註冊路由 動態映射HttpHandler 2. WebAPI 路由 註冊路由 調用GetRouteData 3. 2個路由系統銜接 GlobalConfiguration HostedHttpRoute 4. 補充 路由是進入Web API的第一扇門.目的用於確定C ...
  • 一、博客系統進度回顧 目前已經完成了,前臺展示,以及後臺發佈的功能,最近都在做這個,其實我在國慶的時候就可以弄完的,但是每天自己弄,突然最後國慶2天,連電腦都不想碰,所以就一直拖著,上一篇寫了前端實現用到的一些WebUI框架以及一些系統中用到的js插件,其實寫了這麼久,還是第一次,有人留言,不要爛尾 ...
  • 這兩天看一個要離職同事交接的代碼,看到一個淺拷貝的方法感覺挺好,在這裡記錄一下。 一、方法體 是一個靜態方法CopyHelper,包含以下三個部分 1、給PropertyInfo[]類型加個擴展的方法,方便進行查詢是否存在相同類型,相同名稱的欄位。 2、淺拷貝的主體方法,即調用上面的方法基礎上,如果 ...
  • 最前面的話:Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...