Памятка усекается из базы данных Access в строку VBA
У меня есть поле памятки в моей базе данных Access (2003) для хранения EntryID папок из Outlook (около 750 символов). Я пытаюсь вернуть эту строку, чтобы переместить некоторую почту в этот идентификатор папки с этим кодом:
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. Интересно то, что Outlook все равно найдет нужную папку, если нет другой доступной папки с такими же ~ 255 первыми символами. Но в некоторых случаях происходит сбой, потому что их больше одного. Я использую Recordset, чтобы получить памятку из базы данных. Вот мой SQL:
SELECT EntryID FROM Folder
Я наконец нашел некоторую информацию об этом поведении: http://allenbrowne.com/ser-63.html. Тем не менее, я не использую ни один союз или что-то конкретное в моем запросе, как вы можете видеть...
Почему это все еще усекается?
Исходная записка / строка в базе данных:
Усеченная памятка / объект / поле / строка после запроса SQL:
00000000CE5B922DF5D7654C993FFDB4FF79A7A00100000057010000307E7E2D317E305C307E4C6976656C696E6B204851457E307E2D315C307E4C6976656C696E6B204851457E2D357E305C307E4C6976656C696E6B204851457E313233373235387E2D355C307E4C6976656C696E6B204851457E3130323336333431
2 ответа
Как показано в вашей ссылке эта шоуд работа
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")
Я реализовал этот код 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;
}