使用 SDK 导入 Dynamics CRM 附件数据

Dynamics CRM Attachment Data Import Using SDK

我正在尝试将 Attachments/Annotations 导入 CRM Dynamics,我正在使用 SDK 执行此操作。

没有使用数据导入向导。

不是单独创建注释实体,而是以编程方式使用Data Import Feature

我主要利用了 SDK 示例代码 (SDK\SampleCode\CS\DataManagement\DataImport) 中的 DataImport 示例。

     Import import = new Import()
            {
                ModeCode = new OptionSetValue((int)ImportModeCode.Create),
                Name = "Data Import"
            };
 Guid importId = _serviceProxy.Create(import);


_serviceProxy.Create(
                   new ColumnMapping()
                   {
                       ImportMapId = new EntityReference(ImportMap.EntityLogicalName, importMapId),
                       ProcessCode = new OptionSetValue((int)ColumnMappingProcessCode.Process),

                       SourceEntityName = sourceEntityName,
                       SourceAttributeName = sourceAttributeName,

                       TargetEntityName = targetEntityName,
                       TargetAttributeName = targetAttributeName

                   });

我遇到错误 "The reference to the attachment could not be found"。

documentation说crm异步服务会在磁盘上找到物理文件并上传,我的问题是异步服务在哪里寻找附件文件?

我尝试将 documentbody 字段映射到桌面上附件的完整路径,但仍然没有用。

下面的答案是在问题编辑澄清使用导入向导而不是 SDK 之前提供的。以下答案特定于使用 SDK。


当您通过 SDK 将文件附加到 CRM 中的注释(注释)记录时,您确实使用了 documentbody 属性(以及 mimetype),但您必须先将其转换base64.

像这样:

var myFile = @"C:\Path\To\My\File.pdf";
// Do checks to make sure file exists...

// Convert to Base64.
var base64Data = Convert.ToBase64String(System.IO.File.ReadAllBytes(myFile));

var newNote = new Entity("annotation");

// Set subject, regarding object, etc.

// Add the data required for a file attachment.
newNote.Attributes.Add("documentbody", base64Data);
newNote.Attributes.Add("mimetype", "text/plain"); // This mime type seems to work for all file types.

orgService.Create(newNote);

我在 obscure blog post 中找到了解决方案,我认为文档具有误导性或不清楚,整个事情的工作方式使得服务器磁盘上的文件可供异步处理,很奇怪。

遵循相同的原则,所有内容都应像 csv 文件本身一样发送,同时 linked 到同一个导入。

为了解决这个问题,我们需要为每个物理附件创建单独的特殊 Internal ImportFile,并将其 link 导入具有附件记录详细信息的文件。

正如您在下面看到的,link使用 ImportId 导入附件 ImportFile,然后设置两个属性(ProcessCode 和 FileTypeCode),最终一切正常。

可以说使用此方法比单独创建注释记录更有效、更快捷。

foreach (var line in File.ReadLines(csvFilesPath + "Attachment.csv").Skip(1))
            {
                var fileName = line.Split(',')[0].Replace("\"", null);
                using (FileStream stream = File.OpenRead(attachmentsPath + fileName))
                {
                    byte[] byteData = new byte[stream.Length];
                    stream.Read(byteData, 0, byteData.Length);
                    stream.Close();
                    string encodedAttachmentData = System.Convert.ToBase64String(byteData);

                    ImportFile importFileAttachment = new ImportFile()
                    {
                        Content = encodedAttachmentData,
                        Name = fileName,
                        ImportMapId = new EntityReference(ImportMap.EntityLogicalName, importMapId),
                        UseSystemMap = true,
                        ImportId = new EntityReference(Import.EntityLogicalName, importId),
                        ProcessCode = new OptionSetValue((int)ImportFileProcessCode.Internal),
                        FileTypeCode = new OptionSetValue((int)ImportFileFileTypeCode.Attachment),
                        RecordsOwnerId = currentUserRef
                    };
                    _serviceProxy.Create(importFileAttachment);
                }
                idx++;
            }