说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始。幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去。整个项目结构如下:
类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试
Imports MongoDB.Bson Public Class vbtest Public _id As ObjectId Public content As String End Class
(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
这里创建了一个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完成
窗体程序部分
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内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
主要内容:1、创建项目,2、添加源文件,3、编写代码并运行程序,总结继《 VS2019下载地址和安装教程》之后,本节给大家讲解如何用 VS2019 编写并运行 C 语言程序。 例如,在 VS2019 中编写并运行如下 C 语言代码: 需要经历如下几步操作。 1、创建项目 打开 VS2019,进入如下界面: 图 1 VS2019启动界面 选择“继续但无需代码”,会进入 VS 的主界面,如下图所示: 图 2 VS2019主界面 在菜单中依次选择“文件->新建->项目”
主要内容:在应用程序中添加菜单和子菜单,在窗体中添加剪切,复制和粘贴功能,在窗体中锚定和停靠控件,模态窗体在本章中,我们来学习以下概念和功能应用: 在应用程序中添加菜单和子菜单 在窗体中添加剪切,复制和粘贴功能 锚定和停靠控件在窗体中 模态窗体 在应用程序中添加菜单和子菜单 传统上,,,和类用于在Windows应用程序中添加菜单,子菜单和上下文菜单。 现在,使用,,和控件替换并添加功能到以前版本的菜单相关的控件。但是,为了向后兼容和将来使用,保留了旧的控制类。 先使用旧版本控件创建一个典型的Wi
本文向大家介绍VS2019中QT连接及使用的方法步骤,包括了VS2019中QT连接及使用的方法步骤的使用技巧和注意事项,需要的朋友参考一下 qt连接VS 连接前提是在下载qt的时候将 MSVC 2017装上 点击扩展 选择管理扩展 搜索qt 选择下载 之后下载结束并重新打开后 会弹出一个 QT option 将路径填进去 VS中qt的使用 在qt中可以直接添加信号与槽 在vs中使用是不一样的 直接
本文向大家介绍android编程实现悬浮窗体的方法,包括了android编程实现悬浮窗体的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了android编程实现悬浮窗体的方法。分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下: 它的使用原理很简单,就是借用了Wi
主要内容:ASP.Net内置对象,ASP.Net编程模型,Web窗体,示例动态Web应用程序由以下两种类型的程序中的一种或两种组成: 服务器端脚本 - 这些是使用服务器端脚本语言(如ASP(Active Server Pages)或JSP(Java Server Pages))编写的Web服务器上执行的程序。 客户端脚本 - 这些是在浏览器上执行的程序,使用JavaScript,VBScript等脚本语言编写。 ASP.Net是Microsoft推出的.Net版本的AS
现在我们开始编写全书的第一个程序。跟我们以前学习程序设计的方法不同(以前我们是输入完整程序,然后运行),我们首先利用Visual Studio的可视化编程工具AppWizard生成框架程序,再往里边填写代码。这是一种“填空式”的编程方法:首先生成框架,然后根据目标程序的要求,看哪些地方需要修改,再往里填写代码。类似其他语言,我们把第一个程序命名为Hello。 首先启动AppWizard:在File
本文向大家介绍chat.asp聊天程序的编写方法,包括了chat.asp聊天程序的编写方法的使用技巧和注意事项,需要的朋友参考一下 可能朋友们已经在一些杂志上看到过 ASP 聊天程序的编写方法,但作者在这里自己写了一个更简单的程序,仅仅使用了一个 .asp 文件。请将以下代码剪贴到记事簿并保存为chat.asp。 下面我们来对这个聊天室程序进行逐步的分析。 首先,由于聊天室的所有客户都
本文向大家介绍C#窗体编程(windows forms)禁止窗口最大化的方法,包括了C#窗体编程(windows forms)禁止窗口最大化的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍在C#窗体编程时,如何禁用系统默认的三种将窗口最大化的方式,包括系统菜单、最大化按钮,以及窗口的拖拽。 Windows环境下的窗体,要想最大化,有多种办法。比如最大化按钮,比如拉伸窗口大小,或者是使用系统