1. 程式人生 > 資料庫 >vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

說起來,檢視Mongodb官方的介面文件是場噩夢,儘管mongodb官方花了大力氣整頓了它的API,但是簡單的介面羅列,0程式碼示範,讓人無從開始。幸虧有很多天才,成功破譯,我才得以沿著他們走的路,照貓畫虎的走下去。整個專案結構如下:

vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

類檔案中vbtest.vb資料庫實體類對應著mongodb文件vbtest,用於資料操作測試

Imports MongoDB.Bson

Public Class vbtest
 Public _id As ObjectId
 Public content As String
End Class

vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

(optional)vbmongo.vb是繫結好資料庫實體類vbtest的版本

Imports MongoDB.Bson
Imports MongoDB.Driver

Public Class vbmongo
 Public client
 Public collection As IMongoCollection(Of vbtest)
 Public database As IMongoDatabase
 Public mlist As List(Of vbtest)
 Public builder As FilterDefinitionBuilder(Of vbtest) = New FilterDefinitionBuilder(Of vbtest)
 Public filter As FilterDefinition(Of vbtest)
 Public Sub New(ByVal dbname As String,ByVal collectionname As String)
  client = New MongoClient("mongodb://127.0.0.1:27017")
  database = client.GetDatabase(dbname)
  collection = database.GetCollection(Of vbtest)(collectionname)
 End Sub

 Public Async Function loadrecords() As Task(Of List(Of vbtest))
  filter = builder.Ne(Of ObjectId)("_id",New ObjectId())//_id不等於空的記錄,通過這種方法蹩腳的實現了查詢全部的功能Builder的大多數條件設定函式都用到了泛型Ne(Of TField)
  Dim mlist As List(Of vbtest) = Await collection.Find(filter).ToListAsync()//TField可以理解為 type of field 對應的是實體類中欄位的資料型別例如 OBjectId或者String等等
  Return mlist
 End Function
 Public Async Function loadone(ByVal _id As String) As Task(Of vbtest)
  filter = builder.Eq(Of ObjectId)("_id",New ObjectId(_id))
  Dim mlist As vbtest = Await collection.Find(filter).FirstOrDefaultAsync()
  Return mlist
 End Function

 Public Async Function updateone(ByVal _id As String,ByVal doc As vbtest) As Task(Of vbtest)
  filter = builder.Eq(Of ObjectId)("_id",New ObjectId(_id))
  Dim up As UpdateDefinitionBuilder(Of vbtest) = New UpdateDefinitionBuilder(Of vbtest)()
  Dim updef As UpdateDefinition(Of vbtest)
  updef = up.Set(Of String)("content",doc.content)
  '.Set(Of String)("content",doc)
  collection.UpdateOneAsync(filter,updef)
 End Function

End Class

說起來mongodb的連線可以分幾步,根據連線字串開啟連結,獲取資料庫,獲取文件,進而在文件的基礎上進行增刪改查。對於vb.net操作mongodb,完全是根據c#的操作範例,根據vb.net的語法特點臨摹出來的。

首先需要對專案進行Nuget包的安裝,我們要搜尋的是MongoDB.Driver

vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

這裡建立了一個vb.net的泛型類vbmongoT,只寫了單個查詢,查詢列表和更新操作,函式中大量成對出現了Async和Await關鍵字,用於標識該功能使用了非同步程式設計,在窗體程式中進行呼叫的時候,仍需要在成對的使用Async Await的關鍵字,因為非同步函式返回的往往是Task<TResult>型別(c#)或者 Task(Of TResult) (vb.net)需要在呼叫函式體中使用await關鍵字拿到最終結果Imports MongoDB.BsonImports MongoDB.Driver

Public Class vbmongoT(Of T)
 Public client
 Public collection As IMongoCollection(Of T)
 Public database As IMongoDatabase
 Public mlist As List(Of T)
 Public builder As FilterDefinitionBuilder(Of T) = New FilterDefinitionBuilder(Of T)
 Public up As UpdateDefinitionBuilder(Of T)
 Public updef As UpdateDefinition(Of T)
 Public filter As FilterDefinition(Of T)
 Public Sub New(ByVal dbname As String,ByVal collectionname As String)
  client = New MongoClient("mongodb://127.0.0.1:27017")
  database = client.GetDatabase(dbname)
  collection = database.GetCollection(Of T)(collectionname)
 End Sub

 Public Async Function loadrecords() As Task(Of List(Of T))
  filter = builder.Ne(Of ObjectId)("_id",New ObjectId())
  Dim mlist As List(Of T) = Await collection.Find(filter).ToListAsync()
  Return mlist
 End Function
 Public Async Function loadone(ByVal _id As String) As Task(Of T)
  filter = builder.Eq(Of ObjectId)("_id",New ObjectId(_id))//_id滿足查詢條件的記錄,Builder的大多數條件設定函式都用到了泛型:例如Ne(Of TField)
  Dim mlist As T = Await collection.Find(filter).FirstOrDefaultAsync() 
  Return mlist 
 End Function 
 Public Async Function updateone(ByVal filter As FilterDefinition(Of T),ByVal updef As UpdateDefinition(Of T)) As Task(Of T) 
  'updef = up.Set(Of String)("content",doc.content) '.Set(Of String)("content",doc) 
  Await collection.UpdateOneAsync(filter,updef) 
 End Function 
End Class

在mongodb這一版本的官方API裡,IMongoCollection物件是查詢,新增,更新,刪除等動作的發起者,這裡面查詢,更新,刪除都要用到查詢條件,

官方謂之filter(過濾器)C#: FilterDefinition<T> VB.net:FilterDefinition (Of T)

而過濾器是過濾器模具的建模結果

過濾器模具:C#: FilterDefinitionBuilder<T> VB.net:FilterDefinitionBuilder (Of T)

在Mongodb.Driver這個大類下面 建議直接翻看FilterDefinitionBuilder的介紹 https://mongodb.github.io/mongo-csharp-driver/2.10/apidocs/html/T_MongoDB_Driver_FilterDefinitionBuilder_1.htm

同樣的資料庫文件的更新操作由UpdateDefinitionBuilder 設定更新欄位後產生的 UpdateDefinition完成

窗體程式部分

vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的方法

Imports MongoDB.Bson
Imports MongoDB.Driver

Public Class Form1
 Public client
 Public bsdoc As vbtest
 Public collection As IMongoCollection(Of vbtest)
 Public database As IMongoDatabase
 Public mlist As List(Of vbtest)
 Public builder As FilterDefinitionBuilder(Of vbtest) = New FilterDefinitionBuilder(Of vbtest)
 Public vm As vbmongoT(Of vbtest) = New vbmongoT(Of vbtest)("meandmycoach","vbtest")
 Public filter As FilterDefinition(Of vbtest)
 Private Async Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
  bsdoc.content = RichTextBox1.Text
  vm.filter = vm.builder.Eq(Of ObjectId)("_id",New ObjectId(ComboBox1.Text))
  vm.up = New UpdateDefinitionBuilder(Of vbtest)
  vm.updef = vm.up.Set(Of String)("content",bsdoc.content)
  'vm.up.Set(Of String)("content",bsdoc.content)
  vm.updef = vm.up.Combine(vm.updef)
  vm.updateone(vm.filter,vm.updef)

 End Sub

 Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
  vm = New vbmongoT(Of vbtest)("meandmycoach","vbtest")
  Dim bsdoc As vbtest = New vbtest()
 End Sub

 Private Async Sub PictureBox1_Click(sender As Object,e As EventArgs) Handles PictureBox1.Click
  mlist = Await vm.loadrecords()
  For i As Integer = 0 To mlist.Count - 1
   ComboBox1.Items.Add(mlist(i)._id.ToString())
  Next
  ComboBox1.Text = ComboBox1.Items(0)
  Label2.Text = mlist.Count.ToString()
 End Sub

 Private Sub RichTextBox1_TextChanged(sender As Object,e As EventArgs) Handles RichTextBox1.TextChanged

 End Sub

 Private Async Sub ComboBox1_TextChanged(sender As Object,e As EventArgs) Handles ComboBox1.TextChanged
  bsdoc = Await vm.loadone(ComboBox1.Text)
  RichTextBox1.Text = bsdoc.content
 End Sub

 Private Async Sub ComboBox1_SelectedIndexChanged(sender As Object,e As EventArgs) Handles ComboBox1.SelectedIndexChanged

 End Sub
End Class

功能描述:通過點選圖片,載入所有的vbtest文件記錄,combobox1專門用於顯示ObjectId,可以通過ToString()方法轉換為普通字串

隨著下拉框ObjectId的改變,richtext1控制元件載入vbtest實體類對應記錄的Content欄位,可以更改欄位內容後點擊更新提交按鈕完成文件的UpdateOneAsync操作

總結

到此這篇關於vs2019 下用 vb.net編寫窗體程式連線 mongodb4.2的文章就介紹到這了,更多相關vs2019連線 mongodb4.2內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!