Thursday, July 1, 2010

Error loading form in IE6 - "An Error has occured. Try this action again" / "An Error has happened getting the date"

Recently I noticed an issue with viewing some forms using Internet Explorer 6. Here's the senario:

You try to open an entity with a large number of attributes (often multiple date fields). But the form partially loads with the note in the status bar "X items remaining".
At this point IE is not responfing and the only option is to wait or End Task in the Task Manager.

After a long wait, the form finally loads. But with Errors:

You may also get various other errors.
Solution:

This error is probably related to the maximum number of concurrent TCP connections that Internet Explorer 6 can open. By default IE 6 only allows maximum of two TCP connections. If the browser tries to open a third, it freezes and waits for another connection to become available. This is particularly seen on a web page with several http AJAX type calls to the server. Various CRM 4.0 components such as the date/time field use AJAX to retrieve data.
This problem has been resolved in IE 8.0 onwards. But you can increase the TCP connections in a browse using a registry setting that’s often used to improve and speed up IE’s performance.

Open RegeditNavigate to [HKEY_CURRRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]

Add a new DWORD
MaxConnectionsPer1_0Server
Enter a decimal value for the new Key of at least 8

Add another new DWORD
MaxConnectionsPerServer
Enter a decimal value for the new Key of at least 8


More details on setting this registry key: http://www.windowsreference.com/internet-explorer/speed-up-internet-explorer-by-tweaking-maximum-connections/

Error Importing Organization in CRM 4.0:

Error: Import Organization (Name=, Id=) failed with Exception:System.Data.SqlClient.SqlException: The transaction log for database 'XXXX_MSCRM' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

This error suggestes that the database transaction log has grown beyond maximum size or disk is full. The odds are that you have a fairly large database reaching a few GB. There are 2 possible solutions here...

Solutions 1
Since importing an Organization in CRM 4.0 will involve a lot of work, the transaction log occasionally tends to become unmanageably large. First try to lower the log size.

In the database properties screen set "Recovery Mode" to simple:

Now remember to change this setting back to "Full". This is only dependant on your system's recovery strategy.

If you don't have at least Update Rollup 8 installed then it may be time to do so now. This provides a new and improved Organization Import functionality as described here (http://support.microsoft.com/kb/977867). Remember that you would still need to add and set the new registry key "OptimizeOrgImport" manually.

Monday, December 14, 2009

Still experiencing "Transaction was deadlocked on lock resources with another process"?

I recently posted and article about the following error:
Exception: System.Data.SqlClient.SqlException: Transaction (Process ID XX) was deadlocked on lock resources with
another process and has been chosen as the deadlock victim. Rerun the transaction.
See http://kiavashshakibaee.blogspot.com/2009_07_01_archive.html
I've recently found that in addition to the original solution, there are occasions when a deadlock cannot be avoided.

In my case, after running a trace log, I found the error to be reported on a sql "Select" statement. Your plugin is probably attempting to read a record while CRM or another plugin has it locked.

The solution to this issue is to enable "Read Committed Snapshot Isolation (RCSI)". Enabling RCSI causes SQL to maintain a snapshot of the database against which read operations are executed, writes and updates are still performed against the actual database, this means that write operations no longer block read operations. (see http://blogs.msdn.com/craigfr/archive/2007/04/25/read-committed-isolation-level.aspx for more)

To enable RSCI, ensure you have exclusive connection to the CRM Database and run the following SQL script:

ALTER DATABASE (CRM Organization)_MSCRM
SET
READ_COMMITTED_SNAPSHOT ON
go
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
go

Thursday, July 2, 2009

Transaction (Process ID XX) was deadlocked on lock resources with another process and has been chosen as the deadlock victim

Asynchronous Plugin Error: "System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Data.SqlClient.SqlException: Transaction (Process ID XX) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."

This error will be reported using the CRM Trace Diag Tool. To simplify the analysis of the trace log, you can use Stunware's CRM Trace Log Viewer.

This error signifies that there are two plugins or two instances of a plugin trying to write to the same entity. It seems that the Microsoft Dynamics CRM Asynchronous Service does not handle threading and deadlocks too well internally.

As I understand, the CRM Asynchronous Service often collects a load of jobs and executes them all together. The problem is that one plugin may lock the entire SQL table while writing to one record. During this process's very short writing time, the service also executes a bunch of other plugins. So we're going to experience a deadlock in the event that another plugin needs to write to the same entity.

How do we get around it? Use the Lock call to synchronise all asynchronous plugins. This will ensure that only one update is sent to the database at a time.

public class SalesOrderDetailPreCreate : SalesOrderDetail, IPlugin
{
static Object thisLock = new Object();

public void Execute(IPluginExecutionContext context)
{
lock (thisLock)
{
//
// Do your stuff and entity update here
//...
}
}
}

As far as I understand, it is a good idea to use this code on any asynchronous plugin as in a multi user environment, there is fair chance of a clash at some time.

Sunday, April 19, 2009

New Dynamics CRM 4.0 Demo VPC Image Released for Download - 17-Apr-2009

The new Dynamics CRM 4.0 demo virtual image has been released for download 17-Apr-2009.

https://mbs.microsoft.com/partnersource/deployment/methodology/vpc/MSD_CRM4VPCApril09 (Available to MS partners only)

Similar to previous versions, this in a CRM 4.0 image is on a Window Server 2003 with office, Sharepoint, OCS, Outlook, SQL Server, Reporting Services... Primarily, this is intended to demonstrate the power of CRM to prospective clients. Though many developers use this image as a basis for a development environment.

If you are in sales, then you will be happy to know that the new image is now pre-loaded with some additional accelerators and packed with many demo tools.

As a developer you should probably give a satisfied nod to the fact that there are SDKs and developer tools such as Visual Studio 2008 pre-installed.

My only issue is that due to the accelerators, this is no longer a clean install or a clean base image that I can use for customisaion of a new project. I guess its time to create my own Dev image and stop freeloading.

Thursday, April 9, 2009

Microsoft Dynamics CRM Developer Toolkit

The Microsoft Dynamics CRM Developer Toolkit has just been release but the CRM E2 team.

this tool is a major step forward to provide developers with the ability to work with CRM customizations from within the Visual Studio development environment.

As release by the Microsoft Dynamics CRM Product Team:




The MS CRM E2 team is pleased to announce the release of the Microsoft Dynamics CRM Developer Toolkit, which is available for download from the MSDN Code Gallery at http://code.msdn.microsoft.com/E2DevTkt

The Toolkit has been designed to make it easier for developers to customize, extend, and maintain an on-premise CRM solution, all from within an integrated Visual Studio environment. Key developer benefits include the ability to:
  • View All CRM Entities - Displays a listing of CRM entities that are dynamically available from the CRM Explorer within Visual Studio 2008
  • Create and Update CRM Entities - Allows for creating new entities and updating existing entities from within the CRM Explorer experience
  • Create a Wrapper Class - Provides the ability to auto-generate wrapper classes for entities, which exposes the CRM entities and their corresponding attributes as classes and properties respectively to enable development of code to interact with the entities
  • Generate Plug-in Code - Enumerates the available Plug-ins for an entity and generates the code necessary to jumpstart the plug-in development process
  • Integrate the Build and Deploy Process - Simplifies the process of building and deploying a CRM solution
  • Deploy Across Multiple Servers - Assists in deployment and maintenance of Windows installer packages across multiple environments


Find more information on this toolkit here.

See Jim Wang's technical blog [MVP] for quick installation instructions.

Thursday, March 19, 2009

LINQ to CRM

LINQ to CRM is one of Microsoft’s latest additions to the .Net 3.5 Framework Library. This library provides a uniform method of access to different types of entities, through a query language very similar to SQL. To learn more, see MSDN’s reference to LINQ to Entities and TechTarget’s LINQ Learning Guide.

I’m very excited to talk about the new LINQ to CRM libraries available recently. Say you need to retrieve an Account Number, given the Account Name…

Using the traditional webservice methods:
ColumnSet cols = new ColumnSet();
cols.AddColumns(new string[] {"accountnumber"});

QueryByAttribute
query = new QueryByAttribute();
query.ColumnSet = cols;
query.EntityName = "account";
query.Attributes = new string[] {"name"};
query.Values = new string[] {"Microsoft Dynamics CRM"};

RetrieveMultipleRequest req = new RetrieveMultipleRequest();
req.Query = query;
req.ReturnDynamicEntities = true;

RetrieveMultipleResponse resp = oService.Execute(req) as RetrieveMultipleResponse;
BusinessEntityCollection becMultipleRecords = resp.BusinessEntityCollection;
if (deSalesOrder.Properties.Contains("accountnumber"))
{
//And So On
//And So Forth
}


Using LINQ to SQL:
var accounts = (from a in context.Accounts
where a.Name.Equals("Microsoft Dynamics CRM")
select a).ToList();
LINQ2CRM.Account acc = (Account)accounts.First();
Response.Write("Account name = " + acc.Name.ToString());

The choice seems obvious to me, but I’ll try to contain myself. Though the available LINQ to CRM libraries already address select and update of data, there are still shortfalls. Functionality such as Assign and Set Status are still not available and need to be performed via the traditional methods. But judging by progress so far, I’m sure it won’t be long.

LINQ to CRM on CodePlex is a (Beta) community library available free for download and evaluation. I’m always a supporter of free and community based software, so I highly recommend support of this project. Ofcourse being in Beta, this is work in progress and I would not recommend use of this assembly commercially.

XrmLinq is a commercially available package. This is a much more complete and stable library. Installation and use is remarkably simple and functionally fairly complete. License fee is based on per deployment which makes it a little more costly than I would prefer but is available for free to CRM providers for development purposes. A subset of this library and source code is available on CodePlex for any curioustechies.