2012-10-12 49 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類型的字段。 –