Sunday, 14 January 2007

Hi

Sometimes I run into this error, when deploying a BizTalk project from VS.NET: "An error has occurred while establishing a connection to the server.  When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"

I take a quick look at it, bang my head in the desk for doing it again, and then I perform the following steps:

  1. Rightclick on the project and choose Properties
  2. Go to "Configuration Properties" => "Deployment"
  3. Change the "Server" property to be the servername of the SQL Server you are deploying to
  4. Save changes
  5. Deploy again

This happens if you receive a copy of someone elses project - since the servername is listed in the projectname.btproj.user file that is a part of the project.

Hope someone else gets quickly past this hurdle now it has been blogged.

--
eliasen

Sunday, 14 January 2007 21:43:48 (Romance Standard Time, UTC+01:00)  #    Comments [4]  | 

Hi

I have just had a client who was upgrading from the BizTalk Accelerator for SWIFT 2.3SP1 to the 2006 Message Pack, and it didn't go as expected.

Basically, after upgrading, using the migration guide found at http://www.microsoft.com/downloads/details.aspx?FamilyID=5f0a2355-b17f-479c-9b14-f784d5da9a95&DisplayLang=en, it didn't work. A warning appeared in the eventlog when trying an MT541 document:

An exeption occured inside the rule engine instance executing policy "MT541_Master_Policy"... Now, the obvious errors were checked for - the policy WAS deployed and undeploying it gave a whole new error. So something must go wrong at runtime, evaluating the policy. The policy only consisted of a single rule, but this rule has plenty of actions. I tried removing the actions one at the time, in new versions of the policy, and finally found out that it wouldn't work until I had removed ALL the actions.

So, basically, something must be very wrong.

The solution ended up being doing some assembly binding.

The migration guide states that:

"You must configure the assembly bindings on all computers in your environment using .NET Framework 1.1. You do not need to configure the assembly bindings for computers using .NET Framework 2.0. "

BUT, it is wrong! When using BizTalk 2006, which, as we all know, is running under .NET 2.0, you STILL need to do the assembly binding. You just need to do it using the .NET 2.0 Configuration instead of the .NET 1.1 Configuration, as written in the migration guide.

After that, the error disappeared, but another one turned up:

Now I was really mad. This error looks just like the first one, it is just another policy that is going wrong. Anyway, this turned out to be a known bug... sort of: http://support.microsoft.com/default.aspx?scid=kb;EN-US;928259 - the KB article states that it is for the Accelerator for SWIFT 2.1 - but actually it is for the 2006 MEssage Pack and applies to BOTH 2.1 AND 2.3.

So I was really in for a difficult job here - having to go against the migration guide form Microsoft and installing a hotfix that wasn't for this version of the accelerator.

I had actually given up, and I started a support incident with Microsoft, so all these steps were done as suggested by the support guy. The support incident hasn't cost me anything, as you might guess :-)

I hope someone else can benefit from this at some point.

--
eliasen

Sunday, 14 January 2007 21:31:43 (Romance Standard Time, UTC+01:00)  #    Comments [3]  | 

Hi

Just read that the 70-630 exam in Office SharePoint Server 2007 and the 70-631 exam in Windows SharePoint Services 3.0 are now available.

Microsoft haven't got the http://www.microsoft.com/learning web site quite up2date yet, but probably it wont take long.

Also, no MCTS certification is listed on the MCTS page yet. But since the two exam-pages refer to TS exam status, I suppose the certifications are on their way.

--
eliasen

Sunday, 14 January 2007 13:44:19 (Romance Standard Time, UTC+01:00)  #    Comments [0]  | 

Hi

I was trying to help someone in the BizTalk newsgroups, creating a flat file schema, and I ran into this very annoying error message: "Unable to match the data in the input stream.". I got the error message after having created the schema and trying to validate an instance, using VS.NET 2005.

I searched and searched...

  • Someone needed to set the "parser_optimization" to "complexity" - I had allready done that.
  • Someone else needed to set the "lookahead_depth to 0 - I had also tried that.
  • Someone needed to set the input type to "Native" instead of XML. Had that been my problem, I wouldn't have blogged about it - I'd be too embarassed :-)

No, the problem was that I had created parts of the schema using the flat file wizard. It had set one of my records to have "minOccurs" = 18 and "maxOccurs" = 18 as well. Since my test instance didn't have that many records in it, I got this error message. Changing the two 18's to the default 1 solved my problem.

I hope Microsoft considers this and perhaps in future releases find a better error description :-)

In order to test it, you can just download the working schema: Exolit_FlatFileSchema.xsd (91.59 KB) and the test instance: Instance.txt (.72 KB) - it will validate. But try to change the minOccurs and maxOccures of the "Invoices"-record to "18" - and revalidate.

Anyway... Hope this helps someone in the future.

--
eliasen

Sunday, 14 January 2007 13:41:33 (Romance Standard Time, UTC+01:00)  #    Comments [3]  | 
Friday, 05 January 2007

Hi

Should you ever run into this warning in the eventlog, when using the SQL Adapter for BizTalk:

your problem is that the SQL Adapter is receiving a result set instead of XML.

There are two possibilities:

  1. As we all know, when using the SQL Adapter to call a stored procedure, you must write "for xml auto, xmldata" (or some variant - I like the "elements" way of things) in your Stored Procedure in order to let the schema generator generate a schema for you. After the schema has been generated, you need to remove the ", xmldata" or else schema data will be returned every time the SP is called instead of real data. Anyway, sometimes people remove too much from the SP, ie. they remove the entire "for xml auto, xmldata" instead of just ", xmldata".
  2. Sometimes, someone forgets to write "for xml auto" after a select statement in the receive location.

Both will cause the above mentioned error.

Hope this has helped someone.

--
eliasen

Friday, 05 January 2007 23:07:27 (Romance Standard Time, UTC+01:00)  #    Comments [4]  | 
Friday, 22 December 2006

Hi

I have just played quickly with receiving flat files.

Often, people create a receive pipeline for each flat file messagetype that must be received. This is done because the flat file disassembler needs to know exactly which document schema is to be used to parse the incoming message, as opposed to the XML disassembler, which will find the schema at runtime. So instead of having several flat file disassemblers in one pipeline, often, many pipelines are created.

BUT, I'd just like to point out that with BizTalk 2006, you can change properties of the pipeline components on a per instance level. So double click on your receive location, click the ellipsis on the pipeline and go to the "DocumentSpecName" property of the flat file disassembler. Why they haven't called it "Document Schema" as it is called in the pipeline designer, I don't know!

Anyway, here you can specify which document schema this pipeline instance should use. You must specify the fully qualified .NET typename of the schema, however. And it is a textbox, not a drop down, as in the designer. You can get the .NET typename by clicking on the .xsd in solution explorer, and taking it from the "Fually Qualified Name" property.

Hope this was helpful

--
eliasen

Friday, 22 December 2006 21:47:24 (Romance Standard Time, UTC+01:00)  #    Comments [3]  | 
Sunday, 17 December 2006

Hi

When generating a schema based on the SQL Adapter, there are some options for manipulating the XML.

I always use the "for xml auto, elements" version, because I'm an "element-kind-of-guy". Others use the "for xml auto" for several reasons:

  1. It is the default
  2. Attributes create smaller XML
  3. They like attributes

None the less, I'm an "element-kind-of-guy" and I do what I want! :-)

Anyway, the schemas that are the result of this leave my schema with loads of records instead of elements, meaning that I can not promote the result to distinguished fields.

There is a way of changing this, though... allthough I really don't consider it to be a nice solution :-)

As an example, I have the following table in a database:

And I have this stored procedure to get the values:

CREATE PROCEDURE [dbo].[Get_eliasen]
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

    -- Insert statements for procedure here
 SELECT * from eliasen for xml auto, elements, xmldata
END

Basically, it returns all rows from the table. The schema generated from this stored procedure will look like this:

The "seqno", "field1", "field" and "field3" are records and not elements. If I want to change them to be elements instead, I need to open the XSD in a text editor and do this manually:

As an example, I will change the record "seqno" into an elements.

The original XSD looks like this:

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://eliasen.dk/SQLAdaterRecordsTest" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <msbtssql:sqlScript value="exec [Get_eliasen]" xmlns:msbtssql="http://schemas.microsoft.com/BizTalk/2003" />
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="SQLAdaterRecordsTestRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="eliasen" xmlns:q1="http://eliasen.dk/SQLAdaterRecordsTest" type="q1:eliasenType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="eliasenType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="seqno" xmlns:q2="http://eliasen.dk/SQLAdaterRecordsTest" type="q2:seqnoType" />
      <xs:element name="field1" xmlns:q3="http://eliasen.dk/SQLAdaterRecordsTest" type="q3:field1Type" />
      <xs:element name="field2" xmlns:q4="http://eliasen.dk/SQLAdaterRecordsTest" type="q4:field2Type" />
      <xs:element name="field3" xmlns:q5="http://eliasen.dk/SQLAdaterRecordsTest" type="q5:field3Type" />
    </xs:choice>
  </xs:complexType>
  <xs:complexType name="seqnoType">
    <xs:simpleContent>
      <xs:extension base="xs:long" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="field1Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="field2Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="field3Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

And I will change it into this:

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://eliasen.dk/SQLAdaterRecordsTest" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <msbtssql:sqlScript value="exec [Get_eliasen]" xmlns:msbtssql="http://schemas.microsoft.com/BizTalk/2003" />
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="SQLAdaterRecordsTestRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="eliasen" xmlns:q1="http://eliasen.dk/SQLAdaterRecordsTest" type="q1:eliasenType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="eliasenType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="seqno" type="xs:long" />
      <xs:element name="field1" xmlns:q3="http://eliasen.dk/SQLAdaterRecordsTest" type="q3:field1Type" />
      <xs:element name="field2" xmlns:q4="http://eliasen.dk/SQLAdaterRecordsTest" type="q4:field2Type" />
      <xs:element name="field3" xmlns:q5="http://eliasen.dk/SQLAdaterRecordsTest" type="q5:field3Type" />
    </xs:choice>
  </xs:complexType>
  <xs:complexType name="field1Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="field2Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="field3Type">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

So what have I done?

  1. I Found the definition of the record "seqno". It was based on the type "q2:seqnoType".
  2. I found where the "seqnoType" type was declared, and noted that it extended "xs:long".
  3. I changed the type of "seqno" from "q2:seqnoType" to be "xs:long".
  4. I removed the q2 namespace declaration from the seqno element, as it was no longer needed.
  5. I removed the "seqnoType" type declaration, as it was no longer needed.

That's it. Save the XSD and reload it in your schema editor - you will get this:

But it sure would be nice to have the option of just changing it in the properties of an elements in the schema editor...

Hope this helps someone.

EDIT on the 4'th of march 2007: Remember also that the record just below the root node must be set as "maxOccurs=1" instead of unbounded. Otherwise, you can not promote the fields below the record, obviously.

--
eliasen

Sunday, 17 December 2006 23:42:35 (Romance Standard Time, UTC+01:00)  #    Comments [4]  | 
Saturday, 09 December 2006

Hi

I ran into this issue today. It turned out that the error occured in an expression shape that used xpath to get a value from a message into a variable.

Having been using xpath expressions inside my orchestrations for a long time, I am really not used to having them fail on me :-) And this particular xpath expression was copied from the "Instance XPath" property of the element in the schema editor. So it shouldn't fail. I did add a "[1]" to the xpath because I needed to access the first element of a re-occuring element, but still - not something I hadn't done plenty of times before.

Actually, it took quite some time before I discovered what was wrong. My expression was:

DeliveryDate = xpath(OrderMessage, "/*[local-name..........");

and I needed to change it to

DeliveryDate = xpath(OrderMessage, "string(/*[local-name..........)");

Again, something I have done a million times... this time I just forgot it. And honestly, I really don't think the error message gives a very good idea of what is wrong...

Hope this gets indexed and someone later on will find it helpful :-)

--
eliasen

Saturday, 09 December 2006 23:24:28 (Romance Standard Time, UTC+01:00)  #    Comments [13]  | 

Hi

On my current project, I ran into a small issue. In my orchestration, I created a record in a table in a database. The stored procedure that created the record also returned the ID of the record. This ID was to be emailed to a trading partner in the body of an html email. The trading partner could reply, and I needed to correlate on the ID of the record in the database.

But how to do that? The body of the email is one long rawstring with the ID embedded in the HTML.

Off course, there was the obvious way; Just use a property that is never used in some property schema. I happen to know that my solution will never actually use the POP3.Subject property, and therefore I can use it for my purposes. So when I create the Message to be sent out by email to the trading partner, I put the ID inside the POP3.Subject property. When the message is sent, I initialize a correlation set that is based on this single property. I have then also promoted some element of the reply from the trading partner to the same property, and this works just great.

BUT, I am not a fan of misusing properties like that. I find it a bit ugly. So I looked for alternatives, and then I found the /dev/null adapter written by BizTalk MVP Tomas Restrepo. Baiscally, the adapter discards anything it receives. Tomas writes that it can be used to subscribe to anything in order to avoid getting the "No subscribers found" errors, but I found another use for it.

So I created a dummy schema that only had one element in it and promoted that element to a property of my own property schema. I also promoted the appropriate element from the reply from the trading partner to the same property. In my orchestration, I then created a correlation set based on this property, and I added a send port that sends out an instance of the dummy schema just after sending out the email to a port using the /dev/null adapter. The message doesn't go anywhere, but the correlation set gets initialized and I can follow it later on in my orchestration.

See my solution at CorrelationAfterSMTPSend.zip (94,37 KB)

Remember that you must download and install the /dev/null adapter before trying this.

And see the solution without using Tomas' adapter here: CorrelationAfterSMTPSendWithoutDevNull.zip (78,18 KB)

Pros and cons... Well, the first obvious solution is much simpler, as it doesn't require a dummy schema, it doesn't require a property schema and the orchestration doesn't need to create and instance of the dummy schema and send it out. On the other hand, it really isn't pretty to use the properties like that.

The second solution requires installing an adapter, registering it, and all the legwork described above. But the solution uses my own properties and the POP3.Subject property can be use later on, should it be necessary.

Oh well, use whichever you like best :-)

Hope this was helpful to someone.

 

Updated on the 10'th December 2006:

Well, had I taken the time to think it over again before writing the blog entry, I would have realized that my first obvious approach, which is using the POP3.Subject property doesn't actually have to use an existing property in an existing property schema. I could just as easily have created my own property schema and used that instead.

The reason I abandoned this approach was, that after creating the property schema and creating a property inside the property schema, to which I promoted fields in the schemas, I couldn't assign values to it in message assignment shapes. The property just didn't show up using intellisense in the message assignment shapes.

So I went ahead and used the POP3-Subject property instead. BUT, I discovered that I can actually assign values to my own properties. I just need to change a property of the property element in the property schema. The property element needs to be marked as "MessageContextPropertyBase" in the "Property Schema Base" property of the property element in the property schema.

So, I have abandoned the /dev/null adapter, although I liked the idea :-) And am now using my own property. The best of the two worlds! :-)

--
eliasen

Saturday, 09 December 2006 23:17:36 (Romance Standard Time, UTC+01:00)  #    Comments [0]  | 
Tuesday, 05 December 2006

Hi

Updated at the bottom with a solution.

I have this very weird problem. I have created a functoid, but silly, as I am, I created an icon for it that was way to big. So I wanted to remove the functoid from the toolbox and deploy another functoid instead.

This turned out to be quite a difficult task. I have removed the functoid from GAC and I have removed it from the "Mapper Extensions" folder of the BizTalk installation folder. I have then reset the toolbox. The functoid is STILL there. Actually, I can do whatever I want, even boot the server, but the functoid stays in the toolbox. If I move my mouse over it in the toolbox, VS.NET 2005 will crash very hard, so this isn't desirable :-) If I am very quick, I can go to the functoid, right click on it and delete it from the toolbox. Yiepee, it is gone. BUT, resetting the toolbox makes the functoid reappear :-(

Another guy has the same problem, and at this moment, a support incident with Microsoft is being evaluated. Microsoft have reproduced the behaviour, they claim, so I am awaiting the answer to this peculiar problem any time now.

I will post the solution here, off course.

Update with a solution posted on 9'th December 2006:

Solution 1:

Log on to Windows, using a username other than that, under which this error occurs. The ser must have administrative priviledges.

Right click on "My Computer", Select Properties, Advanced Tab, User Profiles -> Settings and delete the profile that is experiencing the problem.

Logout, and login as the user that had the problem. The problem should now be gone.

This solution has a great drawback, though - the profile is deleted (duh!) This means that alll your settings for all kinds of programs are removed and you need to recreate them. For instance, VS.NET 2005 thinks it is the first time it is started the next time you start it.

Solution 2:

Microsoft stated another solution that should work, but this one I haven't tested:

  1. Ungac the Assembly
  2. Remove the Assembly from Mapper Extension Folder.
  3. Choose Items on the Toolbox and Unselect the offending items
  4. Then do a Reset Toolbox

--
eliasen

Tuesday, 05 December 2006 21:59:06 (Romance Standard Time, UTC+01:00)  #    Comments [3]  | 

Theme design by Jelle Druyts