使用SDK导入Dynamics CRM附件数据

时间:2016-08-01 00:46:00

标签: dynamics-crm data-import

我正在尝试将附件/注释导入CRM Dynamics,我正在使用SDK执行此操作。

使用数据导入向导。

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

我主要利用SDK示例代码中的 DataImport 示例(SDK \ SampleCode \ CS \ DataManagement \ 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

                   });

我收到错误“无法找到对附件的引用。”

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

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

2 个答案:

答案 0 :(得分:0)

在编辑问题之前提供了以下答案,阐明了使用导入向导而不是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);

答案 1 :(得分:0)

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

为了遵循相同的原则,所有内容都应该像csv文件一样发送,同时链接到同一个导入。

要解决此问题,我们需要为每个物理附件创建单独的特殊内部 ImportFile,并将其链接到具有附件记录详细信息的导入。

如下所示,使用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++;
            }