使用 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++;
}
我正在尝试将 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++;
}