我正在尝试将附件/注释导入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字段映射到桌面上附件的完整路径,但仍然无效。
答案 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++;
}