using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Tooling.Connector;
class Program
{
static void Main()
{
string url = "Your_Dynamics_365_URL";
string username = "Your_Username";
string password = "Your_Password";
// 创建连接器实例
CrmServiceClient service = new CrmServiceClient($"{url}; Username={username}; Password={password}; authtype = Office365");
// 验证连接
if (service.IsReady)
{
Console.WriteLine("连接成功!");
}
else
{
Console.WriteLine("连接失败,请检查 URL、用户名和密码。");
}
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
QueryExpression query = new QueryExpression("Account"); // 假设检索 Account 实体
query.ColumnSet = new ColumnSet(new string[] { "Name", "AccountNumber" }); // 指定要检索的字段
EntityCollection result = orgService.RetrieveMultiple(query);
foreach (Entity entity in result.Entities)
{
Console.WriteLine($"Account Name: {entity.GetAttributeValue<string>("Name")}, Account Number: {entity.GetAttributeValue<string>("AccountNumber")}");
}
}
}
Dynamic
类型可以更灵活地创建实体对象。例如,以下代码演示了如何动态创建一个客户实体:using Microsoft.Xrm.Sdk;
using Microsoft.Crm.Sdk.Messages;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
dynamic customer = new
{
FirstName = "John",
LastName = "Doe",
Email = "johndoe@example.com"
};
Entity entity = new Entity("Contact"); // "Contact" 为客户实体的逻辑名称
entity["firstname"] = customer.FirstName;
entity["lastname"] = customer.LastName;
entity["emailaddress1"] = customer.Email;
orgService.Create(entity);
Console.WriteLine("客户创建成功!");
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
QueryExpression query = new QueryExpression("Contact");
query.Criteria.AddCondition("firstname", ConditionOperator.Equal, "John"); // 查找名为 John 的客户
query.ColumnSet = new ColumnSet(new string[] { "contactid" });
EntityCollection result = orgService.RetrieveMultiple(query);
if (result.Entities.Count > 0)
{
Entity customer = result.Entities[0];
dynamic updateData = new
{
phone = "12345670"
};
customer["telephone1"] = updateData.phone;
orgService.Update(customer);
Console.WriteLine("客户信息更新成功!");
}
else
{
Console.WriteLine("未找到指定客户。");
}
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.IPlugin;
public class SetDefaultValuePlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// 获取服务上下文
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// 检查是否是创建客户实体的事件
if (context.MessageName == "Create" && context.PrimaryEntityName == "Contact")
{
Entity entity = (Entity)context.InputParameters["Target"];
// 设置默认值
entity["description"] = "这是一个新客户";
}
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Tooling.Connector;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
// 创建插件注册信息
PluginRegistrationInfo pluginInfo = new PluginRegistrationInfo
{
Name = "SetDefaultValuePlugin",
Description = "设置客户默认值的插件",
PluginType = PluginType.Synchronous,
Mode = PluginMode.PostOperation,
EntityLogicalName = "Contact",
Message = "Create",
AssemblyName = "YourAssemblyName",
ClassName = "YourNamespace.SetDefaultValuePlugin"
};
// 注册插件
orgService.Create(pluginInfo);
Console.WriteLine("插件注册成功!");
}
}
using Microsoft.Xrm.Sdk.Workflow;
public class MyWorkflow : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
// 获取服务上下文
IWorkflowContext workflowContext = context.GetExtension<IWorkflowContext>();
IOrganizationService service = context.GetExtension<IOrganizationServiceFactory>().CreateOrganizationService(workflowContext.UserId);
// 业务逻辑代码
// 例如,发送电子邮件通知
// 这里只是一个简单的示例,实际的业务逻辑可能更复杂
Console.WriteLine("工作流执行!");
}
}
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
class Program
{
static async Task Main()
{
string url = "Your_Dynamics_365_Web_API_URL";
string username = "Your_Username";
string password = "Your_Password";
string tenantId = "Your_Tenant_Id";
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetAccessToken(username, password, tenantId));
// 发送 GET 请求获取数据
HttpResponseMessage response = await client.GetAsync("/api/data/v9.1/accounts");
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
else
{
Console.WriteLine($"请求失败,状态码:{response.StatusCode}");
}
}
}
static async Task<string> GetAccessToken(string username, string password, string tenantId)
{
using (HttpClient client = new HttpClient())
{
string tokenUrl = $"https://login.microsoftonline.com/{tenantId}/oauth2/token";
var formData = new Dictionary<string, string>
{
{ "grant_type", "password" },
{ "resource", "https://yourcrmorg.crm.dynamics.com" },
{ "username", username },
{ "password", password }
};
HttpResponseMessage tokenResponse = await client.PostAsync(tokenUrl, new FormUrlEncodedContent(formData));
if (tokenResponse.IsSuccessStatusCode)
{
string tokenContent = await tokenResponse.Content.ReadAsStringAsync();
dynamic tokenData = JsonConvert.DeserializeObject<dynamic>(tokenContent);
return tokenData.access_token;
}
else
{
Console.WriteLine($"获取访问令牌失败,状态码:{tokenResponse.StatusCode}");
return null;
}
}
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System.Data.SqlClient;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
QueryExpression query = new QueryExpression("Contact");
query.ColumnSet = new ColumnSet(new string[] { "firstname", "lastname", "emailaddress1" });
EntityCollection result = orgService.RetrieveMultiple(query);
// 连接到外部数据库
string connectionString = "Your_Database_Connection_String";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
foreach (Entity entity in result.Entities)
{
string firstName = entity.GetAttributeValue<string>("firstname");
string lastName = entity.GetAttributeValue<string>("lastname");
string email = entity.GetAttributeValue<string>("emailaddress1");
string insertQuery = $"INSERT INTO Customers (FirstName, LastName, Email) VALUES ('{firstName}', '{lastName}', '{email}')";
using (SqlCommand command = new SqlCommand(insertQuery, connection))
{
command.ExecuteNonQuery();
}
}
}
}
}
QueryExpression
的 Top
属性来返回的记录数,使用 Skip
和 Take
方法进行分页查询。using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
QueryExpression query = new QueryExpression("Account");
query.ColumnSet = new ColumnSet(new string[] { "Name", "AccountNumber" });
query.Top = 100; // 只返回前 100 条记录
query.PageInfo = new PagingInfo
{
PageNumber = 1,
Count = 100 // 每页 100 条记录
};
EntityCollection result = orgService.RetrieveMultiple(query);
// 处理数据
foreach (Entity entity in result.Entities)
{
// 处理实体数据
}
}
}
async
和 await
关键字来实现异步操作。例如,在与外部系统集成时,使用异步方法发送 HTTP 请求:using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
string url = "Your_URL";
using (HttpClient client = new HttpClient())
{
// 发送异步 GET 请求
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
else
{
Console.WriteLine($"请求失败,状态码:{response.StatusCode}");
}
}
}
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
QueryExpression query = new QueryExpression("report");
query.ColumnSet = new ColumnSet(new string[] { "name", "description" });
EntityCollection result = orgService.RetrieveMultiple(query);
foreach (Entity entity in result.Entities)
{
Console.WriteLine($"报表名称: {entity.GetAttributeValue<string>("name")}, 描述: {entity.GetAttributeValue<string>("description")}");
}
}
}
若要使用 SSRS 生成更复杂的报表,可以在 Visual Studio 中创建报表项目,连接到 Dynamics 365 的数据库(或使用其数据视图)。通过编写 SQL 查询和使用报表设计工具,可以设计出包含各种图表、表格和数据透视表的报表。例如,要创建一个显示不同地区客户销售额的报表,可以编写查询从 “客户”、“订单” 和 “地区” 相关实体中获取数据,然后在 SSRS 中设计报表布局。
使用 Power BI 时,可以通过 Power BI Desktop 连接到 Dynamics 365 数据源。可以使用 Power Query 编辑器来提取、转换和加载数据。例如,可以从 “账户” 实体获取数据,对其进行清洗和转换,然后创建可视化报表,如柱状图显示不同行业客户数量,或折线图展示销售额随时间的变化。
using Microsoft.Xrm.Sdk;
using Microsoft.Crm.Sdk.Messages;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
// 创建自定义实体
EntityMetadata newEntityMetadata = new EntityMetadata
{
SchemaName = "New_CustomEntity",
DisplayName = new Label("新自定义实体", 1033),
DisplayCollectionName = new Label("新自定义实体集合", 1033),
Description = new Label("这是一个新的自定义实体", 1033),
OwnershipType = OwnershipTypes.UserOwned,
IsActivity = false
};
CreateEntityRequest createEntityRequest = new CreateEntityRequest
{
Entity = newEntityMetadata,
PrimaryAttribute = new StringAttributeMetadata
{
SchemaName = "new_customentityname",
DisplayName = new Label("自定义实体名称", 1033),
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
MaxLength = 100
}
};
orgService.Execute(createEntityRequest);
Console.WriteLine("自定义实体创建成功!");
// 添加自定义字段到新实体
StringAttributeMetadata newFieldMetadata = new StringAttributeMetadata
{
SchemaName = "new_customfield",
DisplayName = new Label("新自定义字段", 1033),
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
MaxLength = 50
};
CreateAttributeRequest createAttributeRequest = new CreateAttributeRequest
{
EntityName = "New_CustomEntity",
Attribute = newFieldMetadata
};
orgService.Execute(createAttributeRequest);
Console.WriteLine("自定义字段创建成功!");
}
}
之后,可以像操作其他实体一样对自定义实体进行数据插入、更新和查询操作。这为满足特定业务需求提供了极大的灵活性。
using Microsoft.Xrm.Sdk;
using Microsoft.Crm.Sdk.Messages;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
// 创建新的安全角色
Role newRole = new Role
{
Name = "新安全角色",
BusinessUnitId = new EntityReference("businessunit", Guid.NewGuid())
};
CreateRoleRequest createRoleRequest = new CreateRoleRequest
{
Role = newRole
};
CreateRoleResponse createRoleResponse = (CreateRoleResponse)orgService.Execute(createRoleRequest);
Console.WriteLine("安全角色创建成功!");
// 为安全角色添加对实体的权限
RolePrivilege privilege = new RolePrivilege
{
PrivilegeId = new EntityReference("privilege", Guid.NewGuid()),
Depth = PrivilegeDepth.Local
};
RolePrivileges privileges = new RolePrivileges
{
RolePrivileges1 = new RolePrivilege[] { privilege }
};
GrantPrivilegesRequest grantPrivilegesRequest = new GrantPrivilegesRequest
{
RoleId = createRoleResponse.RoleId,
Privileges = privileges
};
orgService.Execute(grantPrivilegesRequest);
Console.WriteLine("权限授予成功!");
}
}
还可以实现数据加密,对敏感数据字段进行加密处理。例如,对于包含客户信用卡信息的字段,可以使用加密算法在存储和传输过程中保护数据安全。可以使用.NET 提供的加密类库,如System.Security.Cryptography
命名空间中的类来实现加密和解密功能。
IPluginExecutionContext
来获取相关实体的数据,并根据业务逻辑进行操作。例如,在订单创建插件中:using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.IPlugin;
public class OrderCreationPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
if (context.MessageName == "Create" && context.PrimaryEntityName == "salesorder")
{
Entity order = (Entity)context.InputParameters["Target"];
EntityReference customerRef = order.GetAttributeValue<EntityReference>("customerid");
Entity customer = service.Retrieve(customerRef.LogicalName, customerRef.Id, new ColumnSet(true));
// 更新客户购买历史
//...
EntityReference productRef = order.GetAttributeValue<EntityReference>("productid");
Entity product = service.Retrieve(productRef.LogicalName, productRef.Id, new ColumnSet(true));
// 检查产品库存
//...
// 生成
//...
}
}
}
工作流可以用于自动化一些后续流程,如在订单完成后一定时间内自动发送满意度调查邮件给客户。
If-Match
头来传递实体的版本号。如果在更新时版本号不匹配,说明数据已经被其他用户修改,此时可以根据业务需求决定是重新获取最新数据并再次尝试更新,还是采取其他处理方式。在 C# 代码中:using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
class Program
{
static void Main()
{
// 连接到 Dynamics 365(假设已经建立连接)
CrmServiceClient service = // 你的连接代码;
OrganizationServiceProxy orgService = service.OrganizationServiceProxy;
Entity customer = orgService.Retrieve("contact", new Guid("customer_guid"), new ColumnSet(true));
customer["emailaddress1"] = "new_email@example.com";
UpdateRequest updateRequest = new UpdateRequest
{
Target = customer,
ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches
};
try
{
orgService.Execute(updateRequest);
Console.WriteLine("客户信息更新成功!");
}
catch (OptimisticConcurrencyException ex)
{
Console.WriteLine("并发冲突,数据已被其他用户修改。");
// 处理冲突逻辑,如重新获取数据并更新
}
}
}
此外,还可以使用数据库事务来确保一系列操作的原子性。例如,在一个复杂的业务流程中,涉及多个实体的创建和更新操作,可以将这些操作包装在一个数据库事务中,以防止部分操作成功而部分操作失败导致的数据不一致问题。
System.Diagnostics.Stopwatch
来测量代码的执行时间。using System.Diagnostics;
class Program
{
static void Main()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// 执行关键业务代码,如查询大量数据或复杂的计算
//...
stopwatch.Stop();
Console.WriteLine($"操作执行时间: {stopwatch.ElapsedMilliseconds} 毫秒");
}
}
如果发现性能问题,可以通过分析代码执行路径、数据库查询计划等方式进行优化。例如,优化查询语句、增加索引、调整插件和工作流的逻辑以减少不必要的操作。同时,对于系统出现的异常情况,可以通过日志记录(可以使用.NET 的日志框架,如Microsoft.Extensions.Logging
)来分析问题原因,及时修复问题。
通过以上从入门到精通的各个阶段的学习和实践,开发者可以在 C# 中熟练地使用 Dynamic 365 开发各种复杂的业务应用,满足企业多样化的业务需求,同时确保系统的高性能、安全性和可维护性。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务