首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

PropertyBag.Contents=byte()报错,该怎么解决

2012-12-29 
PropertyBag.Contentsbyte()报错PropertyBag.ContentsByte数组这句代码报: Invalid procedure call or a

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 = b
End Sub


[解决办法]
二进制数据就应该用二进制字段存取。
数据库字段如果是 Ansi/DBCS 的字符串类型,会按照指定的字符集进行编码/解码,不在代码页中的字符就会导致写入和读出不一致(乱码)。

热点排行