[AX]AX2012 使用.net Business connector
通过.Net Business connector可以在.net的工程中访问AX的数据及功能,要使用.Net Business connector首先需要安装它的组件,可以脱离client单独安装使用,在连接到AX系统时使用windows验证。在.net工程比如C#工程中添加对程序集Microsoft.Dynamics.BusinessConnectorNet.dll的引用,一般安装在目录C:\Program Files (x86)\Microsoft Dynamics AX\60\Client\Bin\下。C#工程的Target framework必须选择为.NET Framework 4.0,即使是.NET Framework 4.0 client profile也是不行的,因为会间接使用到不包含在client profile中的System.Web程序集,还需要更新工程的app.config为:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>
否则会提示类似“Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.”的错误。
Microsoft.Dynamics.BusinessConnectorNet命名空间下包含了登陆AX、AX纪录等众多的类型,访问AX纪录数据的一个典型用法是这样的:
Microsoft.Dynamics.BusinessConnectorNet.Axapta DynAx = new Microsoft.Dynamics.BusinessConnectorNet.Axapta(); Microsoft.Dynamics.BusinessConnectorNet.AxaptaRecord DynRec; try { // Authenticate the user and establish a session. DynAx.Logon(null, null, null, null); // Define the record as the CustTrans table. DynRec = DynAx.CreateAxaptaRecord("CustTrans"); // Define the query that will run on the CustTrans records. // This will return all the data in the CustTrans table with // the cursor positioned at the first record in the table. string fieldAccountNum = ("AccountNum"); DynRec.ExecuteStmt(string.Format(@"select * from %1 where %1.{0} == '1102'", fieldAccountNum)); // Check if the query returned any data. if (DynRec.Found) { // Display the record on the form that was retrieved from the query. textBox1.Text = (string)DynRec.get_Field("AccountNum"); } } // In a finally block, log the user off. finally { DynAx.Logoff(); } }
首先创建一个Axapta类型的对象,从它登陆连接到AX系统,在Axapta.Logon()参数中可以指定要登陆到公司、语言、AOS服务器等信息,再创建AxaptaRecord类型的对象,使用这个对象来访问AX表的数据。如果得到的结果集不只一条纪录,可以使用while (axRecord.Found) {.... axRecord.Next();}来循环读取所有纪录。
AxaptaRecord对象也可以用来向AX的表中插入纪录,比如:
// Create the .NET Business Connector objects. Axapta ax; AxaptaRecord axRecord; string tableName = "CustStatisticsGroup"; try { // Login to Microsoft Dynamics AX. ax = new Axapta(); ax.Logon(null, null, null, null); // Create a new CustStatisticsGroup table record. using (axRecord = ax.CreateAxaptaRecord(tableName)) { // Provide values for each of the CustStatisticsGroup record fields. axRecord.set_Field("CustStatisticsGroup", "04"); axRecord.set_Field("StatGroupName", "No Priority Customer"); // Commit the record to the database. axRecord.Insert(); } } catch (Exception exception) { MessageBox.Show(string.Format("Error encountered: {0}", exception.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Take other error action as needed. }
同样AxaptaRecord也可以更新纪录数据:
Axapta ax; AxaptaRecord axRecord; string tableName = "CustStatisticsGroup"; try { // Login to Microsoft Dynamics AX. ax = new Axapta(); ax.Logon(null, null, null, null); // Update the ‘High Priority Customer’ table record. using (axRecord = ax.CreateAxaptaRecord(tableName)) { // Execute a query to retrieve an editable record where the StatGroupName is “High Priority Customer”. axRecord.ExecuteStmt("select forupdate * from %1 where %1.CustStatisticsGroup =='01'"); // If the record is found then update the record. if (axRecord.Found) { // Start a transaction that can be committed. ax.TTSBegin(); axRecord.set_Field("StatGroupName", "Priority Customer"); axRecord.Update(); // Commit the transaction. ax.TTSCommit(); } } } catch (Exception e) { Console.WriteLine("Error encountered: {0}", e.Message); // Take other error action as needed. }
和删除纪录:
Axapta ax; AxaptaRecord axRecord; string tableName = "CustStatisticsGroup"; try { // Login to Microsoft Dynamics AX. ax = new Axapta(); ax.Logon(null, null, null, null); // Delete the ‘Priority Customer’ table record. using (axRecord = ax.CreateAxaptaRecord(tableName)) { // Execute a query to retrieve an editable record where the StatGroupName is “High Priority Customer”. axRecord.ExecuteStmt("select forupdate * from %1 where %1.CustStatisticsGroup =='01'"); // If the record is found then delete the record. if (axRecord.Found) { // Start a transaction that can be committed. ax.TTSBegin(); axRecord.Delete(); // Commit the transaction. ax.TTSCommit(); } } } catch (Exception e) { Console.WriteLine("Error encountered: {0}", e.Message); // Take other error action as needed. }
注意在做更新和删除纪录时需要使用select forupdate锁定纪录,并使用Axapta.TTSBegin()和Axapta.TTSCommit()开启事务支持。
除了使用AxaptaRecord访问表纪录,也可以使用Axapta调用类的静态方法:
Axapta ax; string sID = "@SYS21669"; object o; bool b; try { // Login to Microsoft Dynamics Ax. ax = new Axapta(); ax.Logon(null, null, null, null); } catch (Exception e) { Console.WriteLine("An error occurred in object creation or Axapta logon: {0}", e.Message); return; } // Logon was successful. try { // Call a static class method. // In this example, call SysLabel::labelId2String2 // to determine the label string for a particular label ID. o = ax.CallStaticClassMethod("SysLabel", "labelId2String2", sID); } catch (Exception e) { Console.WriteLine("An error has been encountered during CallStaticClassMethod: {0}", e.Message); b = ax.Logoff(); return; } // Display the returned string. Console.WriteLine("The label string for {0} is {1}.", sID, o.ToString()); Console.WriteLine("Press any key to continue."); Console.ReadLine(); // Log off from Microsoft Dynamics AX. b = ax.Logoff();
总体来说这些操作纪录和Class方法和早先版本的AX com接口是很类似的。
在上面的例子中都使用了Axapta.Logon()方法使用当前Windows登陆用户来连接AX,Axapta对象还提供了LogonAs()方法,可以指定登陆AX的用户账户,其用法是:
Microsoft.Dynamics.BusinessConnectorNet.Axapta DynAx; DynAx = new Microsoft.Dynamics.BusinessConnectorNet.Axapta(); System.Net.NetworkCredential nc = new System.Net.NetworkCredential("ProxyUserId", "password"); DynAx.LogonAs(Environment.UserName,"FullyQualifiedDomainName",nc,"dat", "en-us"," company1@AOS:2713","AXClient"); DynAx.LogonAs(Environment.UserName,"FullyQualifiedDomainName",nc,"dat", "en-us","company1@AOS:2713","c:\\Client.axc");
这里使用了NetworkCredetial传入了一个代理账号,就是说登陆用户可以和.net bussiness connector代理用户不是一个账号,这个账号必须在System administrator->Setup->System service account中定义,一些AX的组件比如Enterpsie portal使用这个代理账号连接到AOS。
只有满足以下条件中一条的用户才可以使用.NET Bussiness connector:
- 用户被授予系统管理员角色
- 用户被授予Bussiness connector角色
- 用户被授予.Net business connector 操作特权,包括SysCom、SysComExecution、SysComDataCreate等。
更多有关.NET bussiness connector的内容见http://msdn.microsoft.com/en-us/library/aa659581。