将Oracle LONG解压缩到VBA中的string
我很难从数据库中获取LONG
字段,并进入我的Excel(VBA + ADO)应用程序。 我想知道有没有人可以帮忙?
这样做根本没有任何效果(投射到一个string,或不)。
myString = dataset!long_field
我尝试了GetChunk
方法,它应该做我希望的:
myString = CStr(dataset!long_field.GetChunk(1000))
这确实得到了一些东西,但这不是我期望的数据(通常是一些乱码)。 奇怪的是,如果我尝试在立即窗口中运行这个代码,那么我会得到一些希望:
Debug.Print CStr(dataset!long_field.GetChunk(1000)) ello W orld !
我不知道为什么(有点)在立即窗口而不是其他地方。 另外注意:
-
甲骨文似乎正在使用某种2字节编码,所以有奇怪的间距
-
从一开始就有大量的数据丢失; 这应该是“Hello World!”
我的另一个攻击计划是在数据库端编写一个函数,将long
转换为varchar2
。 不幸的是,这也失败了,因为我需要访问的表是在我的模式之外,我没有从function中select数据的合适的授权(Oracle抱怨没有find表)。
所以我有点失落:(任何想法?
这适用于我:
Debug.Print BinaryToString(RS.Fields("long_raw").Value)
其中“RS”是包含查询结果的ADOlogging集,“BinaryToString”如下所示。
Function BinaryToString(Binary) 'Antonin Foller, http://www.motobit.com 'Optimized version of a simple BinaryToString algorithm. Dim cl1, cl2, cl3, pl1, pl2, pl3 Dim L cl1 = 1 cl2 = 1 cl3 = 1 L = LenB(Binary) Do While cl1 <= L pl3 = pl3 & Chr(AscB(MidB(Binary, cl1, 1))) cl1 = cl1 + 1 cl3 = cl3 + 1 If cl3 > 300 Then pl2 = pl2 & pl3 pl3 = "" cl3 = 1 cl2 = cl2 + 1 If cl2 > 200 Then pl1 = pl1 & pl2 pl2 = "" cl2 = 1 End If End If Loop BinaryToString = pl1 & pl2 & pl3 End Function
结果GetChunk
确实有效:我做了一些沙箱testing,虽然仍然有奇怪的编码,但它确实返回了我想要的所有数据。 因此,我不知道为什么数据在我的主要查询中出现乱码; 所以我的解决scheme是只使用一个获取长数据的函数并解码它,并在需要时调用它,而不是将数据包含在主查询中。