VB.NET访问Access数据库

wenluderen 2018-08-16 01:30:02
最近做了一个程序。先测试A功能(康耐视 VP视觉),后测试B功能(基于MX 访问三菱PLC)。最后要A&hB整合在一起。

此时悲剧了发现A功能必须是64位编译。 B功能必须32位编译。

但是A和B必须交互数据。

咋办呢。

微软提供了一种复杂的办法。感觉太难。

最后还是采取保守的办法。

就是A程序和Access数据局交互数据。B程序和Access数据库交互数据。

用Access数据库中转A和B的数据。

×××
好了以上是背景。

×××
找了一圈资料,最终是Youtube 找到了一个视频
https://www.youtube.com/watch?v=XRVBpTFa3To
还是高清的1080P的。 可以看清楚代码。照的作下来。
步骤如下:
第一步:
新建一个Acdess数据库,并在里面添加表格。(我用的Office是2016)


第二步:新建一个VB.net窗口程序。我用的VS2012.


第三步:在VS里面添加数据库
这个步骤比较关键,我将其细分
...全文
1367 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
良朋 2018-11-13
  • 打赏
  • 举报
回复
引用 19 楼 wenluderen 的回复:
[quote=引用 18 楼 itleon 的回复:]
你真纠结。 VisionPro换成32位的很容易啊,破解也容易。
或者你直接用tcpip通讯啊,本地服务器地址127.0.0.1,也很容易实现。

VP 目前破解不容易, 8.2的版本 似乎需要人工介入 在可以继续使用。
8.2之后的版本目前 网上有自制硬件狗 ,是收费的。

访问本地127.0.0.1 这个方式的确是可行的。

不过我差了很多资料,大家都是 内存映射这种方案 效率最高。

所以我想试试

刚才测试一下,一张1024×768 的图像传递,瞬间传递过去了。

××
最后谢谢你的建议

如果你有9.0版本VP的破解,我出1000 ,有偿咨询方案[/quote]

我还真有9.0的破解版。
良朋 2018-08-27
  • 打赏
  • 举报
回复
引用 19 楼 wenluderen 的回复:
[quote=引用 18 楼 itleon 的回复:]
你真纠结。 VisionPro换成32位的很容易啊,破解也容易。
或者你直接用tcpip通讯啊,本地服务器地址127.0.0.1,也很容易实现。

VP 目前破解不容易, 8.2的版本 似乎需要人工介入 在可以继续使用。
8.2之后的版本目前 网上有自制硬件狗 ,是收费的。

访问本地127.0.0.1 这个方式的确是可行的。

不过我差了很多资料,大家都是 内存映射这种方案 效率最高。

所以我想试试

刚才测试一下,一张1024×768 的图像传递,瞬间传递过去了。

××
最后谢谢你的建议

如果你有9.0版本VP的破解,我出1000 ,有偿咨询方案[/quote]

内存映射是怎么搞的? 是用图片的宽度、高度及内存的首地址指针复制的吗?贴出来大家共享一下
至于vp, 8.3之前有破解程序,随便破,无限制的破。9.0的我要测试一下。
wenluderen 2018-08-21
  • 打赏
  • 举报
回复
引用 18 楼 itleon 的回复:
你真纠结。 VisionPro换成32位的很容易啊,破解也容易。
或者你直接用tcpip通讯啊,本地服务器地址127.0.0.1,也很容易实现。

VP 目前破解不容易, 8.2的版本 似乎需要人工介入 在可以继续使用。
8.2之后的版本目前 网上有自制硬件狗 ,是收费的。

访问本地127.0.0.1 这个方式的确是可行的。

不过我差了很多资料,大家都是 内存映射这种方案 效率最高。

所以我想试试

刚才测试一下,一张1024×768 的图像传递,瞬间传递过去了。

××
最后谢谢你的建议

如果你有9.0版本VP的破解,我出1000 ,有偿咨询方案
wenluderen 2018-08-20
  • 打赏
  • 举报
回复
感谢 https://blog.csdn.net/SANTOOK/article/details/7483595
的分享

进程A代码如下:

Public Class Form1
Dim MF As System.IO.MemoryMappedFiles.MemoryMappedFile 'MemoryMappedFile 内存映射文件对象
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MF = MF.CreateNew("SYSIO", 5000) '在主共享进程中创建一个非常驻的内存映射文件,其大小为5000字节
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim buf(4) As Byte
Dim s As Single
Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream '内存映射文件的视图流
ms = MF.CreateViewStream()
s = Rnd()
buf = BitConverter.GetBytes(s)
ms.Write(buf, 0, buf.Length) '向内存映射文件写入信息
End Sub
End Class



进程B代码如下:


Public Class Form1
Dim MF As System.IO.MemoryMappedFiles.MemoryMappedFile
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MF = MF.OpenExisting("SYSIO") '打开一个内存中已经存在的映射,也就是主共享进程中创建的内存映射文件
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim buf() As Byte = {0, 0, 0, 0, 0}
Dim ms As System.IO.MemoryMappedFiles.MemoryMappedViewStream
ms = MF.CreateViewStream()
ms.Read(buf, 0, buf.Length) '读取该映射文件中的指定内容

Me.TextBox1.Text = BitConverter.ToSingle(buf, 0)
End Sub
End Class
  • 打赏
  • 举报
回复
进程间通讯方式很多,有些也很容易,例如 udp、命名管道,甚至监听同一个数据文件或者共享内存(这并不用什么c++概念来纠结“内存地址”)。甚至你通过 windows 邮件机制,也好过拼凑的增删改查轮询。

起码来说,通讯就是通讯,跟增删改查知识不一样。
  • 打赏
  • 举报
回复
如果完全没学过跨进程通讯知识,有可能习惯于纠结于关系数据库增删改查。可能连数据文件都不用,非要用关系数据库。

有项目经验的人才会清楚“玩儿的”小程序各种凑结果的编程方法,跟实际的正规厂商出品的技术区别。
wenluderen 2018-08-20
  • 打赏
  • 举报
回复


引用 11 楼 xomix 的回复:
你既然知道A功能64位B功能32位就应该想到Access这个功能是否分64位和32位,如果你想到了就会在两个项目编译后放入不同的Access库。



你说没有错,我刚才测试了。 有以下几个地方
1)AccessDatabaseEngine的版本 是和我们的IDE开发设定的版本有关系。 比如我要设定开发32位程序,就要安装32位
AccessDatabaseEngine。
和Office自身没有关系。
2)32位的AccessDatabaseEngine 和64位的AccessDatabaseEngine 不可以装在一个操作系统下。

3)我在64位的编译环境使用向导添加ACcess数据库(通过32位的AccessDatabaseEngine).可以编译成工。
但是运行时报错
报错内容如下:

良朋 2018-08-20
  • 打赏
  • 举报
回复
你真纠结。 VisionPro换成32位的很容易啊,破解也容易。
或者你直接用tcpip通讯啊,本地服务器地址127.0.0.1,也很容易实现。
面向医学编程 2018-08-19
  • 打赏
  • 举报
回复
貌似这种连接不了,好像是缺东西了,那时我的也连接不上数据库,好像需要换个net框架。
  • 打赏
  • 举报
回复
引用 11 楼 xomix 的回复:
你既然知道A功能64位B功能32位就应该想到Access这个功能是否分64位和32位,如果你想到了就会在两个项目编译后放入不同的Access库。
Access库访问组件(ADO)
  • 打赏
  • 举报
回复
你既然知道A功能64位B功能32位就应该想到Access这个功能是否分64位和32位,如果你想到了就会在两个项目编译后放入不同的Access库。
智造引领未来 2018-08-17
  • 打赏
  • 举报
回复
引用 8 楼 stherix 的回复:
一方面是,必须确定是不是必须分2个进程,而不能整合到一个进程里
然后用Access来交换数据是比较慢的
c#要做内存共享难实现,你可以用TCP进行通讯,也比数据库交换好
或者用一个消息队列来推送,比如弄一个本机的Redis

1)A 和 B两个功能 可以放在两个进程里面。 只不过由于A是64位,B是32位的。 编译的过程就报错了
2)这个项目最终最出来的系统可以接受200MS的延时。感觉这个时间足够完成一次数据到Access,然后数据从Access读出
3)消息 队列 和Redis 这个我都不熟悉。以前做过Mysql 感觉数据库的通用性比较好。
4)关于两个程序在一台PC上交互数据,以前用MFC的时候 测试过油槽之类的功能。可以用的
5)关于在一台PC上,共享内存。这个应该是比较困难的。我们都看不到真实的内存地址,被微软用虚拟内存地址挡住了

智造引领未来 2018-08-17
  • 打赏
  • 举报
回复
关于 未在本地计算 机注册Micrsoft。ACE。OLEDB12.0
stherix 2018-08-16
  • 打赏
  • 举报
回复
一方面是,必须确定是不是必须分2个进程,而不能整合到一个进程里
然后用Access来交换数据是比较慢的
c#要做内存共享难实现,你可以用TCP进行通讯,也比数据库交换好
或者用一个消息队列来推送,比如弄一个本机的Redis
wenluderen 2018-08-16
  • 打赏
  • 举报
回复
显然 此处是DataSet.XSD 是非常重要的。所以的一切的都是围绕他展开的
他是啥? 应该就是数据库的类。而且这个类是变化的。 只不过这个的代码不是写出来的
是有一些向导工具 去生产的。

在这个案子里面,数据库有两个Table。 系统自动会每个table写了一个函数
SELECT ID, FromPLC, Bool FROM TableFormPLCToScada
SELECT ID, Item, Result FROM TableFromScadaToPLC

这两个函数的输入参数是 表格名称

返回数据是表里面全部的东东

智造引领未来 2018-08-16
  • 打赏
  • 举报
回复
需要说明的,配置完成后。 会在form的下面会出现 DataSet.XLD.

并且自动生成了一个函数,确切来说是子函数。 这个函数里面是一个SQl语句,这个语句可以查询所以信息 并返回

如下图


这个里面有个测试SQl语句的功能 。

智造引领未来 2018-08-16
  • 打赏
  • 举报
回复
增删改查 全有了
智造引领未来 2018-08-16
  • 打赏
  • 举报
回复
下面又回到代码端操作
第四步:将Data 拖拽到 Form上,会自动新建很多东西。具体是什么 不清楚
wenluderen 2018-08-16
  • 打赏
  • 举报
回复
关于文件位置
wenluderen 2018-08-16
  • 打赏
  • 举报
回复
B:

报错是因为 没有装驱动

在微软官网有下载
http://www.cnblogs.com/liweis/p/4615999.html 这个链接里面有解决方案
加载更多回复(1)

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧