====== Writing .NET clients ====== Lundalogik provides a helper library called Lundalogik Data Access that simplifies working with Lime CRM Web Service from .NET code. The library is available as a NuGet package from [[https://www.nuget.org/packages/Lundalogik.DataAccess/|nuget.org]]. ===== Connecting ===== ==== Using a configuration file ==== To connect to an instance of Lime CRM Web Service, update your application ''.config'' file to resemble this configuration example:
==== Programmatic access ==== It is also possible to configure a connection entirely through code. Follow this example: using Lundalogik.DataAccess.Providers; using Lundalogik.DataAccess; var options = new Lundalogik.DataAccess.Configuration.WebServiceOptions { Address = "http://myserver:8082/", Binding = Lundalogik.DataAccess.Configuration.WebServiceBinding.BasicHttp, SessionMode = Lundalogik.DataAccess.Configuration.SessionMode.Shared }; var provider = new WebServiceProvider(options); var db = new Database("MyDatabase", provider); ===== Code examples ===== Learning by example is usually the best way of learning how to do things. This section contains a number of examples of how to do things using the library. ===== Working with metadata ===== Database.Default.LoadDataStructure(); foreach (Table table in Database.Default.Tables) { Console.WriteLine("Listing fields in table {0}, local name {1}:", table.Name, table.LocalName); foreach (Field field in table.Fields) { Console.WriteLine("\t{0} ({1})", field.Name, field.LocalName); } Console.WriteLine(); } ===== Looking up a table ===== Databse.Default.LoadDataStructure(); Table campaignTable; if (Database.Default.Tables.Lookup(TableLabel.Campaign, out campaignTable)) { Console.WriteLine("The table named \"{0}\" has the campaign table label.", campaignTable.Name); } else { Console.WriteLine("No table having the campaign table label is published for web service access."); } Console.ReadLine(); ===== Executing a query ===== Query q = new Query("person"); q.Conditions.Add("firstname", ConditionOperator.StartsWith, "John"); q.Fields.Add(new string[] { "firstname", "lastname", "email" }); // Retrive all records matching the conditions. Records recsPerson = q.Execute(); // Iterate over the result set. foreach (Record r in recsPerson) { foreach (string fieldName in r.Fields.Names) { Console.WriteLine(string.Format("{0,-20} {1:40}", fieldName, r[fieldName])); } Console.WriteLine(); } ===== Updating a record ===== // First open existing record then update it. Record recPerson1 = Record.Open("person", 1100, new string[] { "note" }); recPerson1["note"] += "\nSome appended information."; recPerson1.Update(); // Immediate update without fetching the record from the server first. Record recPerson2 = Record.Create("person"); recPerson2["note"] = "Testing 1-2-3"; recPerson2.Update(1200); Console.ReadLine(); ===== Adding a record ===== Record recPerson = Record.Create("person"); recPerson["firstname"] = "Amanda"; recPerson["lastname"] = "Panda"; recPerson.Update(); Console.WriteLine("New record ID: {0:D}", recPerson.Id); Console.ReadLine(); ===== Adding multiple records ===== Records recsPerson = new Records("person"); Record newPerson; newPerson = recsPerson.Add(); newPerson["firstname"] = "Keyser"; newPerson["lastname"] = "Soze"; newPerson = recsPerson.Add(); newPerson["firstname"] = "Bosse"; newPerson["lastname"] = "Badabing"; foreach (Record r in recsPerson) { Console.WriteLine("Record id: {0:D}", r.Id); } recsPerson.Update(); foreach (Record r in recsPerson) { Console.WriteLine("Record id: {0:D}", r.Id); } Console.ReadLine(); ===== Opening a specific record ===== int recordId; Console.Write("Please enter a valid company record ID: "); if (int.TryParse(Console.ReadLine(), out recordId)) { Record recCompany; try { recCompany = Record.Open("company", recordId, new string[] { "name", "phone", "fax" }); Console.WriteLine("Name: {0}\nPhone: {1}\nFax: {2}", recCompany["name"], recCompany["phone"], recCompany["fax"]); } catch (ArgumentException) { Console.WriteLine("Invalid record ID."); } } else { Console.WriteLine("Invalid record ID."); } Console.ReadLine(); ===== Limiting the number of returned records ===== Query q = new Query("person"); q.Fields.Add("firstname"); q.Fields.Add("lastname", FieldSortOrder.Ascending, 1); // Retrive the top 5 records. Records recsPerson = q.Execute(5); // Iterate over the result set. foreach (Record r in recsPerson) { foreach (string fieldName in q.Fields.Names) { Console.WriteLine(string.Format("{0,-20} {1:40}", fieldName, r[fieldName])); } Console.WriteLine(); } ===== Adding a document ===== // The table is named "document" Record recDocument = Record.Create("document"); recDocument["name"] = "A test file"; recDocument["filename"] = "test.txt"; // Add a new document, specifying the name of the document field recDocument.Document = new Document("document"); // Lime gets confused if the extension is not specified recDocument.Document.Extension = "txt"; // Put some UTF8 encoded text data in the file UTF8Encoding encoding = new UTF8Encoding(true, false); recDocument.Document.PutData(encoding.GetBytes("Testing 1-2-3 using som simple text data")); // Create the record recDocument.Update(); Console.WriteLine("Document record having ID {0:D} created.", recDocument.Id); Console.ReadLine(); ===== Executing a stored procedure ===== var procedure = new StoredProcedure("csp_compareauthcode"); procedure.Parameters.Add("@person", 1100); procedure.Parameters.Add("@authcode", "banan"); procedure.Parameters.Add("@message", "", ParameterDirection.InOut); ProcedureResult result; result = procedure.Execute(false); Console.WriteLine("Return value: {0:D}\n", result.ReturnValue); Console.WriteLine("Output parameters:"); foreach (KeyValuePair parameter in result.OutputParameters) { Console.WriteLine("Output parameter \"{0}\" has value \"{1}\".", parameter.Key, parameter.Value); } Console.WriteLine("\nResult set:"); Console.WriteLine(result.Data.ToString());