Sql 备忘录从Access数据库截断为VBA字符串

Sql 备忘录从Access数据库截断为VBA字符串,sql,vba,ms-access,livelink,Sql,Vba,Ms Access,Livelink,我在Access 2003数据库中有一个备注字段,用于存储Outlook文件夹的EntryID,大约750个字符。我正试图取回该字符串以将一些邮件移动到该文件夹ID,代码如下: 将myNameSpace设置为Outlook.NameSpace 作为字符串的Dim StoreID Dim target as String'这是长EntryID字符串 将objMail设置为mailitem“某些邮件” 设置myNameSpace=Application.GetNamespaceMAPI StoreI

我在Access 2003数据库中有一个备注字段,用于存储Outlook文件夹的EntryID,大约750个字符。我正试图取回该字符串以将一些邮件移动到该文件夹ID,代码如下:

将myNameSpace设置为Outlook.NameSpace 作为字符串的Dim StoreID Dim target as String'这是长EntryID字符串 将objMail设置为mailitem“某些邮件” 设置myNameSpace=Application.GetNamespaceMAPI StoreID=Application.GetNamespaceMAPI.foldersLiveLink.StoreID Set-dossier=myNameSpace.GetFolderFromIDtarget,StoreID 移动档案 在本例中,目标变量只有前252个字符,而不是748个字符。有趣的是,如果没有其他文件夹具有相同的~255个首字符,Outlook仍会找到正确的文件夹。但在某些情况下,它崩溃是因为不止一个。我正在使用记录集从数据库中获取备忘录。以下是我的SQL:

SELECT EntryID FROM Folder
我终于找到了有关此行为的一些信息:。然而,我并没有在我的查询中使用任何联合或任何特殊的东西,正如您所看到的

为什么它仍然被截断

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

00000000 CE5B922DF5D7654C993FFDB4FF79A7A0010000057010000307E2D317E305C307E4C6976656C696E6B204851457E307E2D315C307E4C6976656C696E6B204851457E2D357E305C307E4C69756C696E6B204851457E3132333732387E2D355C307E4C6976656C696E6B204857E313033473347E33347E33347E3333737363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636C696E6B204851457E3134353933343907E31323930393430385C307E4C6976656C696E6B204851457E313837335353632377E313435333439305C307E4C6976656C696E6B204851457E31313634333236317E3138373353632375C307E4C69756C696E6B2041457E3131363433467E313136363636363663636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636304851457E31313634343333303337E3131363433323839

SQL查询后截断的备注/对象/字段/字符串:

00000000 CE5B922DF5D7654C993FFDB4FF79A7A0010000057010000307E2D317E305C307E4C6976656C696E6B204851457E307E2D315C307E4C6976656C696E6B204851457E2D357E307E4C6976656C696E6B204851457E3132333732387E2D355C307E4C69756C696E6B204857E313033431


如你的链接所示,这应该是可行的

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")

如你的链接所示,这应该是可行的

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;
    }

我已经实现了这个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;
    }

这是关于“从文件夹中选择EntryID”的代码??设置rs=CurrentDb.ExecuteSELECT EntryID FROM Folder,然后再设置target=rsEntryIDpaste一点!!!关于msgboxrsentrydi呢?我不是SQL专家,但似乎我可以使用其中的一些:。但是,我不知道它是否是最优的,并且EntryID并不总是具有相同的长度,因此这可能是一个问题。rsEntryID只包含前251个字符。问题不在于字符串或我的代码,而是从SQL查询中被截断了。这是关于“从文件夹中选择EntryID”的代码吗?设置rs=CurrentDb.ExecuteSELECT EntryID from Folder,然后再设置target=rsEntryId一点!!!关于msgboxrsentrydi呢?我不是SQL专家,但似乎我可以使用其中的一些:。但是,我不知道它是否是最优的,并且EntryID并不总是具有相同的长度,因此这可能是一个问题。rsEntryID只包含前251个字符。问题不在于字符串或我的代码,而在于它从SQL查询中被截断。这就是我实际尝试的。由于某些原因,这些部分为空。用餐时间到了,我一个小时后再回来看看有什么问题,但我想它应该能用。它现在很好用,谢谢。我不知道到底是什么问题,但现在它起作用了。这就是我真正尝试的。由于某些原因,这些部分为空。用餐时间到了,我一个小时后再回来看看有什么问题,但我想它应该能用。它现在很好用,谢谢。我不知道到底是什么问题,但现在它工作了。欢迎使用堆栈溢出!请考虑编辑您的帖子,以添加更多的解释您的代码做什么,为什么它会解决这个问题。一个答案,即使它运行正常,也大多只包含代码,这通常不会帮助OP理解他们的问题。从数据库检索数据的查询只返回一条记录和一个备注字段。带有SequentialAccess参数的ExecuteReader方法允许读取更多的256个字符。我使用函数GetChars每次检索1024个字符。此外,此模式还可以使用函数GetBytes代替GetChars来读取BLOB类型的字段。欢迎使用堆栈溢出!请考虑编辑您的帖子,以添加更多的解释您的代码做什么,为什么它会解决这个问题。一个答案,即使它运行正常,也大多只包含代码,这通常不会帮助OP理解他们的问题。从数据库检索数据的查询只返回一条记录和一个备注字段。带顺序访问参数的ExecuteReader方法 ter允许读取256个字符中的更多字符。我使用函数GetChars每次检索1024个字符。此外,此模式还可以使用函数GetBytes代替GetChars来读取BLOB类型的字段。