Hi all

I have received numeral questions from people getting a compile time error when compiling
an orchestration that assigns a distinguished field of type xs:integer to a variable
of type int32. Without looking into anything, you would expect this would work.

So lets say that we have a schema like this:


with this XSD:

<?xml version="1.0" encoding="utf-16"?>

<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://IntegerDecimal.InputSchema" targetNamespace="http://IntegerDecimal.InputSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="InputRoot">




          <b:property distinguished="true"
xpath="/*[local-name()=’InputRoot’ and namespace-uri()=’http://IntegerDecimal.InputSchema’]/*[local-name()=’MyInteger’ and
namespace-uri()=”]" />






        <xs:element name="MyInteger"
type="xs:integer" />





As you can see, it is a simple schema and the “MyInteger” field is of type xs:integer
and it is marked as a distinguished field.

In my orchestration, I have a variable of type int32 called “MyInt” and in an expression
shape I do this:

MyInt = InputMessage.MyInteger;

and it fails, which is quite surprising at first glance. At compile time I just get
this: "The expression that you have entered is not valid.". That doesn’t
help, so looking at my expression shape and reading the mouse over on the error in
the expression shape I get this: “cannot implicitly convert type ’System.Decimal’
to ’System.Int32’”. Changing the line in the expression shape to this:

MyInt = System.Convert.ToInt32(InputMessage.MyInteger);

will make it work, because now you are explicitly casting the value to an integer.

The first times I saw this error, I thought that the compiler had an error, because
I thought I was assigning an integer the value of another integer. It turns out, though,
that I wasn’t really – only sort of

If you look here: http://www.w3.org/TR/xmlschema-2/#integer you
can see that the xs:integer type is actually a decimal type restricted to whole numbers.
So the compiler actually thinks the field is a decimal and not an integer.

This is kind of silly, since the data type IS restricted to whole numbers. The actual
error should be that the xs:integer can contain the number 4567234987623409763546387623476149823497862354845
which really is way to large for an int variable in an orchestration.

Anyway, the way to handle this is, naturally, to avoid the xs:integer type if possible
and use the xs:int (or variants of this) instead. Sometimes it is needed, though,
and in that case you just need to declare your variables of a type that will be able
to contain all the possible values you receive. This can be an Int16 sometimes, if
the people who have created the schema just didn’t know what the xs:integer type is.
Sometimes the values received will be too large even for an Int64 variable, then consider
using a decimal, a string or some other data type.