vs2019 下用 vb.net窗体程序连接 mongodb4.2「建议收藏」

vs2019 下用 vb.net窗体程序连接 mongodb4.2「建议收藏」说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始。幸亏有很多天才,成功破译,我才得以沿着他们走的路,照…

	vs2019 下用 vb.net窗体程序连接 mongodb4.2[数据库教程]

说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始。幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去。整个项目结构如下:

技术图片

  • 类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试
Imports MongoDB.Bson

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

代码100分

技术图片

  • (optional)vbmongo.vb是绑定好数据库实体类vbtest的版本
代码100分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

技术图片

  • 这里创建了一个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完成

  •  窗体程序部分

 

技术图片

代码100分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

原文地址:https://www.cnblogs.com/saintdingspage/p/13437549.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6872.html

(0)
上一篇 2023-03-31 18:00
下一篇 2023-03-31

相关推荐

  • oracle中procedures_个人拙见啥意思

    oracle中procedures_个人拙见啥意思初看之下不免诧异,这不是一样的嘛,这也能赚到钱? 看看procedure要注意什么?没有return。 再看function要注意什么?有return。 啊这,下面要讲讲返回参数和return。 这二

    2023-05-30
    147
  • 技术分享 | 快速掌握 MySQL 8.0 认证插件的使用「建议收藏」

    技术分享 | 快速掌握 MySQL 8.0 认证插件的使用「建议收藏」作者:郭斌斌 引言 MySQL 8.0.15 版本主从复制时,io 线程一直处于 connecting 状态, 由于复制用户使用的认证插件是 caching_sha2_password,而想要通过 …

    2023-01-29
    146
  • Oracle创建表空间「终于解决」

    Oracle创建表空间「终于解决」建立表空间并设置为默认表空间(最大32GB) 1. create temporary tablespace test tempfile ‘/home/oracle/oradata/abc/test….

    2023-04-07
    157
  • 利用while实现Python程序的循环执行

    利用while实现Python程序的循环执行使用Python语言编写程序时,经常需要让程序反复执行一段指令集,这个时候就需要使用循环结构。while循环结构是Python语言中用来实现循环执行的一种结构。

    2024-03-05
    80
  • 微课程 | 第三课《普通安装方式》[通俗易懂]

    微课程 | 第三课《普通安装方式》[通俗易懂]https://v.youku.com/v_show/id_XNDQ0NzY3MTQ1Ng== 上一期我们介绍了通过 Docker 来安装 DBLE 的安装方式。如果是普通的安装方式我们要怎么做呢?…

    2022-12-22
    146
  • Python dictadd函数详解

    Python dictadd函数详解在日常的python开发中,字典(dict)是十分常用的数据类型。而在实际开发中,我们往往需要对字典进行添加元素的操作。在此背景下,strongPython dictadd函数详解/strong应运而生。在本篇文章中,我们将会从多个方面来对该函数进行详细介绍。

    2024-08-24
    29
  • 以sys.stdout.write为中心写原始标题

    以sys.stdout.write为中心写原始标题在Python中,sys.stdout是用来执行输出操作的标准输出流。它代表着程序标准的输出设备,通常被绑定到控制台窗口或者文件。sys.stdout.write()是标准输出流的方法,它可以将字符串写入标准输出,从而在控制台或文件中显示它们。本文将介绍如何使用sys.stdout.write()来写出具有原始标题的Python程序。

    2024-05-22
    62
  • 9个SQL运维常遇到的问题「建议收藏」

    9个SQL运维常遇到的问题「建议收藏」摘要:本文重点介绍单个SQL语句持续执行慢的场景。 本文分享自华为云社区《GaussDB(DWS) SQL性能问题案例集》,作者:黎明的风。 本文重点介绍单个SQL语句持续执行慢的场景。我们可以对执行

    2023-06-10
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注