使用VBA将自定义类保存到Access表

使用VBA将自定义类保存到Access表,vba,class,ms-access,Vba,Class,Ms Access,我有一个非常奇怪的问题,我不太清楚这是否可能。我建立了一个Access数据库,基本上存储文档。在其中,您可以在Excel中生成这些文档。现在,我让它存储我想作为表值放入单元格的值,比如字符串。但我可能想存储一个属性字符串,这样我也可以存储格式 我知道如何创建一个基本上是属性字符串的自定义类,但是我仍然有一个问题,那就是它需要是一个可以存储在访问表中的对象 我想在表中创建一个OLEObject字段,并将其保存在那里,但当我尝试在该字段中保存自定义类时,它会给我一个错误 运行时错误“438”: 对象

我有一个非常奇怪的问题,我不太清楚这是否可能。我建立了一个Access数据库,基本上存储文档。在其中,您可以在Excel中生成这些文档。现在,我让它存储我想作为表值放入单元格的值,比如字符串。但我可能想存储一个属性字符串,这样我也可以存储格式

我知道如何创建一个基本上是属性字符串的自定义类,但是我仍然有一个问题,那就是它需要是一个可以存储在访问表中的对象

我想在表中创建一个OLEObject字段,并将其保存在那里,但当我尝试在该字段中保存自定义类时,它会给我一个错误

运行时错误“438”:

对象不支持此属性或方法

我尝试创建一个对象变量,然后将自定义类设置为该变量,但仍然存在相同的错误

Dim attStr As New AttributedStringClass
attStr.Value = "Test Test"

Dim oleObj As Object
Set oleObj = attStr

Dim rst As Recordset: Set rst = CurrentDb.OpenRecordset("tblTest")
rst.AddNew
rst("attributeString") = oleObj
rst.Update
AttributedStringClass

Option Compare Database
Option Explicit

Dim zValue As String

Property Get Value() As String
    Value = zValue
End Property

Property Let Value(dValue As String)
    zValue = dValue
End Property
如果我可以存储自定义类,我会让测试变得非常简单,以防这不可能

我想做的事可能吗?还是我找错树了?
提前谢谢

不幸的是,您需要的是对象序列化。net支持序列化,因此您可以将对象转换为XML,或者现在使用的更紧凑、更短的格式是JSON

但是,您可以创建自己的序列化程序。因此,您必须获取您创建的自定义类,并调用例程(传递类对象)以将所有值作为文本输出。也许格式可以是逗号分隔的,或者我想甚至可以是JSON格式(但是我们没有一个好的JSON serlizer/de serlizer,就像在.net中一样)

然后将文本保存在标准备忘录列中。然后可以读取/提取该数据,并调用例程将文本反序列化回对象

但是,由于您知道该类,因此可以公开每个属性,并使用for/each循环。这里列出了这个技巧:

然而,我要做的只是创建您的类,添加所有“成员”,然后简单地添加一个名为serialize和deserializer的例程

因此:

现在,此时将保存备注字段(如前所述,xml、json或csv格式可以)

要拉入并加载(反序列化)该类,我们现在执行以下操作:

 dim rstData           as DAO.Recordset
 ' code to load up reocord set
 set rstData = currentdb.OpenRecordSet("Select * from tblTours where id  =2")

 strCsv = rstData!CData
 dim clsMyClass      as new clsTour
 clsMyclass.Serialize = strCsv

 ' at this point, your class is now loaded with all the correct values.
 eg:
 msgbox "Hotel name = " & clsMyClass.HotelName
因此,在.net世界中,将类序列化为字符串,传递给web服务,然后在该端将对象反序列化回类/对象

在.net中,此生成被内置到框架中。因此,当您调用SOAP或现在更常见的REST服务时,数据将以xml(或json)的形式发送给您。现在,您可以调用反序列化方法,并且现在可以在代码中使用该对象了。因此,这种将类转换为某种“字符串”或其他可以保存为文本或从网站传递(或拉取)的内容的想法现在相当普遍

因此,您的想法和问题相当正常,特别是如果您来自支持序列化的任何现代系统和框架

如前所述,如果您的类只有5-10个值要保存,那么从类所持有的值中序列化和反序列化字符串中的所有值的简单方法一点也不难。但是对于复杂的对象,人们当然会想要一个支持这种自动化的开发平台。在.net中,您可以将任何对象传递给序列化程序,它将吐回xml(或json)字符串。现在该字符串可以保存、发送到网站或某个程序。要获取该对象,需要将该字符串反序列化回该对象,以便在代码中使用


请记住,整个概念只适用于定义良好的类,如果该类不是动态的,则该概念也适用

首先,不能像其他数据类型一样将对象插入OLEObject字段。OLEObject字段存储BLOB-对象必须转换为位图。此转换由OLEObject对话框或示例代码中使用的方法处理。我怀疑你将“自定义类”作为OLEObject的想法是否可行,因为没有与你的自定义类关联的OLEServer。从我在网上看到的情况来看,它与你所说的是一致的。现在我想我会玩弄制作表格来存储数据的想法。我只是觉得如果它可以存储一个自定义类,那就太好了。哦,好的,谢谢你!您所说的“属性化”字符串-粗体、斜体、彩色是什么意思?这就是RichTextFormat的用途,需要在表中保存一个备注字段。RTF是用HTML标记完成的。RTF的未绑定文本框集可以将使用HTML标记格式化的文本显示为ControlSource中的表达式。Excel不解释HTML标记。为什么要使用Excel?
 dim rstData           as DAO.Recordset
 ' code to load up reocord set
 set rstData = currentdb.OpenRecordSet("Select * from tblTours where id  =2")

 strCsv = rstData!CData
 dim clsMyClass      as new clsTour
 clsMyclass.Serialize = strCsv

 ' at this point, your class is now loaded with all the correct values.
 eg:
 msgbox "Hotel name = " & clsMyClass.HotelName