PropertyBag.Contents=byte()报错
PropertyBag.Contents=Byte数组
这句代码报: Invalid procedure call or argument
无效的过程调用或参数
这个数组就是PropertyBag.Contents
用来还原对象的
请高手赐教!
[解决办法]
请看摘自MSDN的部件数据的持久保持:
使用 PropertyBag 对象使对象成为持久保存的
为了使 ActiveX 部件成为持久性的,需要创建 PropertyBag 对象的一个实例。这看起来可能有些多余,类不是已经有了自己的 PropertyBag 吗?为什么不能使用那个 PropertyBag 呢?原因很简单,当对象的生命周期结束的时候,它的 PropertyBag 也将消失。它只存在于内存中;为了保证持久保存,需要在某个合适的位置保存该对象的一份副本,以便在将来需要的时候能够再次将其取出。
PropertyBag 可以被看作一个“大麻袋”,它可以被装满东西,然后藏在某个安全的地方。到底藏在什么地方将完全取决于实现者。下面的窗体代码演示了如何使一个对象持久性地保存在一个文本文件中:
Private pb As PropertyBag ' 声明一个 PropertyBag 对象。
Private LoanObject As Loan ' 声明一个 Loan 对象。
Private Sub Form_Unload(Cancel As Integer)
Dim varTemp as Variant
' PropertyBag 对象的实例化。
Set pb = New PropertyBag
' 使用 WriteProperty 将对象保存在 PropertyBag 中。
pb.WriteProperty "MyLoanObject", LoanObject
' 将 PropertyBag 的内容赋予一个 Variant。
varTemp = pb.Contents
' 将其保存到一个文本文件中。
Open "C:\Loandata.txt" For Binary As #1
Put #1, , varTemp
Close #1
End Sub
PropertyBag 对象的 Contents 属性中包含了以字节数组形式保存的 Loan 对象。为了将其保存到一个文本文件,必须首先将其转换成一种文本文件可以理解的数据类型,例如本例中的 Variant。
利用保存的数据恢复一个对象
当对象已经被保存在文本文件中之后(或者其他类型的存储空间中),它可以被方便地转移到其他位置。请想象 Loan 对象中不仅包含了 InterestRate,还包含了贷款应用程序中所需的其他所有属性值。那么 Loandata.txt 文件可以被递交到中心部门进行验证。如果窗体需要再次使用 Loan 对象,那么代码将类似于下面的样子:
Private pb As PropertyBag ' 声明一个 PropertyBag 对象。
Private LoanObject As Loan ' 声明一个 Loan 对象。
Private Sub Form_Load()
Dim varTemp As Variant
Dim byteArr() as Byte
' PropertyBag 对象的实例化。
Set pb = New PropertyBag
' 将文件的内容读入一个 Variant 中。
Open "C:\Loandata.txt" For Binary As #1
Get #1, , varTemp
Close #1
' 将 Variant 赋值到一个 Byte 数组中。
ByteArr = varTemp
' 赋予 PropertyBag Contents 属性。
Pb.Contents = ByteArr
' 使用 PropertyBag 进行对象实例化。
Set LoanObject = pb.ReadProperty("MyLoanObject")
End If
有人可能已经注意到,对象需要被赋值三次:首先从文本文件到 Variant,然后从 Variant 到 Byte 数组,最后才赋值到 Contents 属性。这是因为,Contents 属性只能接受 Byte 数组,如果试图将其他数据类型赋予它,得到的将是一条错误信息。
那么,到底发生了什么呢?我们是否真的在甲地创建了一个对象,而在乙地重新使用它呢(完全保持了它的数据)?其实,不完全是这样的。实际上,原始的对象已经被消灭了,我们在 PropertyBag 中实际传递的其实只是对象的一份精确副本,而不是对象本身。这种“克隆”一个对象以便进行复用的能力是一种功能非常强大的概念,它对于工作流应用程序的设计尤为重要。
[解决办法]
新对象中,PropertyBag.Contents保存的竟然是Byte(-1)。
也就是说,如果要保存空数据,必须也是Byte(-1)。
如果要保存数据,那么这个Byte()的长度不能小于17个元素即Byte(0 To 16)。
另外,前两个元素值分别必须是&H93和&HB2,这就是我上面说的所谓的格式。
剩余元素的值就无所谓了,哪怕全是0也无妨。
关键点:最小长度和前两个字节的值。
如下代码测试通过:
Private Sub Form_Load() Dim b() As Byte Dim pb As New PropertyBag ReDim b(0 To 16) b(0) = &H93 b(1) = &HB2 pb.Contents = bEnd Sub
[解决办法]
二进制数据就应该用二进制字段存取。
数据库字段如果是 Ansi/DBCS 的字符串类型,会按照指定的字符集进行编码/解码,不在代码页中的字符就会导致写入和读出不一致(乱码)。