2012-10-12 47 views
0

我的Access(2003)数据库中有一个备注字段,用于存储来自Outlook(约750个字符)的文件夹的EntryID。我试图找回那种一些邮件移动到该文件夹​​ID与此代码:备忘录从Access数据库截断为VBA字符串

Dim myNameSpace As Outlook.NameSpace 
Dim StoreID As String 
Dim target as String 'This is the long EntryID string 
Dim objMail as mailitem 'some mail 

Set myNameSpace = Application.GetNamespace("MAPI") 
StoreID = Application.GetNamespace("MAPI").folders("LiveLink").StoreID 
Set dossier = myNameSpace.GetFolderFromID(target, StoreID) 
objMail.Move dossier 

target VAR只有第252个字符,而不是748在这种情况下。有趣的是,如果没有其他可用的相同〜255个首字符的文件夹,Outlook仍然会找到正确的文件夹。但在某些情况下,它会崩溃,因为有不止一个。我正在使用记录集从数据库中获取备忘录。这是我的SQL:

SELECT EntryID FROM Folder 

我终于找到了这种行为的一些信息:http://allenbrowne.com/ser-63.html。但是,我没有在我的查询中使用任何联合或任何特定的内容,因为您可以看到...

为什么它仍然被截断?

原始备忘录/字符串中的数据库:

00000000CE5B922DF5D7654C993FFDB4FF79A7A00100000057010000307E7E2D317E305C307E4C6976656C696E6B204851457E307E2D315C307E4C6976656C696E6B204851457E2D357E305C307E4C6976656C696E6B204851457E313233373235387E2D355C307E4C6976656C696E6B204851457E31303233363334317E313233373235385C307E4C6976656C696E6B204851457E31323930393430387E31303233363334315C307E4C6976656C696E6B204851457E31343539333439307E31323930393430385C307E4C6976656C696E6B204851457E31383735353632377E31343539333439305C307E4C6976656C696E6B204851457E3131363434333236317E31383735353632375C307E4C6976656C696E6B204851457E3131363434333236347E3131363434333236315C307E4C6976656C696E6B204851457E3131363434333238397E3131363 434333236345C307E4C6976656C696E6B204851457E3131363434333330337E313136343433323839

截断备忘录/对象/场/ SQL查询字符串后:

00000000CE5B922DF5D7654C993FFDB4FF79A7A00100000057010000307E7E2D317E305C307E4C6976656C696E6B204851457E307E2D315C307E4C6976656C696E6B204851457E2D357E305C307E4C6976656C696E6B204851457E313233373235387E2D355C307E4C6976656C696E6B204851457E3130323336333431

+0

是绕代码 'SELECT的EntryID FROM文件夹' ?? –

+0

'Set rs = CurrentDb.Execute(“SELECT EntryID FROM Folder”)',然后'target = rs(“EntryID”)' – dnLL

+0

粘贴更多!!!那么'msgbox(rs(“entryID”))' –

回答

1

在你的链接显示此768,16工作

Set rs = CurrentDb.Execute("SELECT Mid(EntryID, 1,250) AS part1, " & _ 
     " Mid(EntryID,251,250) AS part2," & _ 
     " Mid(EntryID,501,250) AS part3," & _ 
     " Mid(EntryID,751,250) AS part4," & _ 
     " Mid(EntryID,1001,250) AS part5 " & _ 
          " FROM Folder;") 
target = rs("part1") & rs("part2") & rs("part3") & rs("part4") & rs("part5") 
+0

这就是我真正想要的。由于某些原因,*部分*为空。吃晚餐的时间,我会在一个小时内回来看看有什么不对,但是,我猜应该这样做。 – dnLL

+0

现在完美,谢谢。我不知道究竟是什么问题,但现在它工作。 – dnLL

0

我已经实现此C#代码:

private string GetMemoField(string TableName, string FieldName, string IdentityFieldName, string IdentityFieldValue, OleDbConnection conn) 
    { 
     string ret = ""; 

     OleDbCommand cmd1 = new OleDbCommand("SELECT " + FieldName + " FROM “ + TableName + “ WHERE " + IdentityFieldName + "=" + IdentityFieldValue, conn); 

       var reader = cmd1.ExecuteReader(System.Data.CommandBehavior.SequentialAccess); // Create the DataReader that will get the memo field one buffer at a time 

     if (reader.Read()) 
     { 
      long numberOfChars = reader.GetChars(/*Field pos*/ 0, 0, null, 0, 0); // Total number of memo field's chars 

      if (numberOfChars > 0) 
      { 
       int bufferSize = 1024; 
       char[] totalBuffer = new char[64*bufferSize]; // Array to hold memo field content 

       long dataIndex = 0; 

       do 
       { 

        char[] buffer = new char[bufferSize]; // Buffer to hold single read 
        long numberOfCharsReaded = reader.GetChars(0, dataIndex, buffer, 0, bufferSize); 

        if (numberOfCharsReaded == 0) 
        { 
         ret = new string(totalBuffer,0, (int)numberOfChars); 
         break; 
        } 

        Array.Copy(buffer, 0, totalBuffer, dataIndex, numberOfCharsReaded);  // Add temporary buffer to main buffer 
        dataIndex += numberOfCharsReaded; 

       } while (true); 
      } 
     } 

     return ret; 
    } 
+1

欢迎来到Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的解释以及为什么它可以解决问题。一个主要包含代码的答案(即使它正在工作)通常不会帮助OP了解他们的问题。 – SuperBiasedMan

+0

从数据库检索数据的查询只返回一条记录并仅返回备注字段。具有“SequentialAccess”参数的“ExecuteReader”方法可以读取更多的256个字符。我已经使用函数“GetChars”每次检索1024个字符。此外,可以使用此模式来使用函数“GetBytes”来代替“GetChars”来读取BLOB类型的字段。 –