code it

Martins Tech Blog

*.udcx-Dateien als sekundäre Datenverbindung zum SQL-Server in InfoPath-Formularen im SharePoint verwenden

Heute beschäftige ich mich mal mit sekundären Datenverbindungen im InfoPath.

Zu den Voraussetzungen: Meine Daten liegen hier in einer Tabelle auf einem SQL-Server 2005 und ich habe ein InfoPath-Projekt im Visual Studio 2005.

Die Einrichtung von sekundären Datenquellen ist recht einfach und kann über den Menüpunkt Data/Data Connections und dem sich dort öffnenden Wizard schnell durchgeführt werden. Manko dieser Methode ist, dass sich nun das Deployment auf andere Rechner etwas schwierig gestaltet, da der komplette ConnectionString in der manifest.xsf steht:

<xsf:dataObject name="customerdata" schema="customerdata.xsd" initOnLoad="yes">
   <xsf:query>
       <xsf:adoAdapter connectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=CRM;Data Source=(local);Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False" commandText="select "id","title" from "dbo"."customerdata" as "customerdata"" queryAllowed="yes" name="customerdata"></xsf:adoAdapter>
   </xsf:query>
</xsf:dataObject>

Jetzt wäre es doch schön, wenn diese Informationen in einer Data Connection Library (DCL)abgelegt und dort administrierbar wären.
Zunächst erzeugt man eine neue UDCX-Datei, die die Verbindung zum SQL-Server beinhaltet:

<?xml version="1.0" encoding="UTF-8"?>
<?MicrosoftWindowsSharePointServices ContentTypeID="0x010100B4CBD48E029A4ad8B62CB0E41868F2B0"?>
<udc:DataSource MajorVersion="2" MinorVersion="0" xmlns:udc="http://schemas.microsoft.com/office/infopath/2006/udc">
   <udc:Name>customerdata</udc:Name>
   <udc:Description>used to retrieve customer data</udc:Description>
   <udc:Type MajorVersion="2" MinorVersion="0" Type="Database"> 
       <udc:SubType MajorVersion="0" MinorVersion="0" Type=""></udc:SubType>
   </udc:Type>
   <udc:ConnectionInfo Purpose="ReadOnly" AltDataSource=""> 
   <udc:WsdlUrl>http://</udc:WsdlUrl>
   <udc:SelectCommand Type="">
   <udc:ListId></udc:ListId>
   <udc:WebUrl>http://</udc:WebUrl>  
   <udc:ConnectionString>Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=CRM;Data Source=(local);Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False</udc:ConnectionString>   
   <udc:OperationName></udc:OperationName>   
   <udc:ServiceUrl>http://</udc:ServiceUrl>   
   <udc:SoapAction></udc:SoapAction>   
   <udc:Query>select id, title from dbo.customerdata as customerdata</udc:Query> 
   </udc:SelectCommand>
   </udc:ConnectionInfo>
</udc:DataSource>

Diese Datei lädt man in eine DCL des SharePoint (Wichtig: Genehmigen nicht vergessen!). Im ersten Schritt des "Data Connection Wizard" im InfoPath-Projekt wählt man nun "Search for connections on a Microsoft Office SharePoint Server". Damit kann man im weiteren Schritt zur vorhin angelegten DCL navigieren und die angelegte udcx-Datei auswählen.

Nun wäre es schön, wenn alles sofort funktionieren würde - tut es aber leider nicht. Visual Studio beglückt mich mit folgender Meldung:
Nun zeige ich zwar gar nicht auf eine lokale oder eine Netzwerkdatei, sondern auf einen SQL-Server, aber nach nur wenigen Minuten Suche ist klar, dass InfoPath sich an dem Servernamen "(local)" stört. Trägt man hier den vollen Namen ein, funktioniert auch das.

Nachdem diese Hürde genommen ist, zeigt sich gleich ein weiteres Problem:

Die Suche nach der Lösung dieses Problems nahm schon etwas mehr Zeit in Anspruch, aber nach endlicher Zeit fand ich heraus, dass InfoPath mir damit sagen wollte, dass es im SQL-Statement unbedingt Quoted Identifiers (also alle Spalten und Tabellennamen mit Anführungszeichen) erwartet.

Die "richtige" udcx-Datei sieht also so aus:

<?xml version="1.0" encoding="UTF-8"?>
<?MicrosoftWindowsSharePointServices ContentTypeID="0x010100B4CBD48E029A4ad8B62CB0E41868F2B0"?>
<udc:DataSource MajorVersion="2" MinorVersion="0" xmlns:udc="http://schemas.microsoft.com/office/infopath/2006/udc">
   <udc:Name>customerdata</udc:Name>
   <udc:Description>used to retrieve customer data</udc:Description>
   <udc:Type MajorVersion="2" MinorVersion="0" Type="Database"> 
       <udc:SubType MajorVersion="0" MinorVersion="0" Type=""></udc:SubType>
   </udc:Type>
   <udc:ConnectionInfo Purpose="ReadOnly" AltDataSource=""> 
   <udc:WsdlUrl>http://</udc:WsdlUrl>
   <udc:SelectCommand Type="">
   <udc:ListId></udc:ListId>
   <udc:WebUrl>http://</udc:WebUrl>  
   <udc:ConnectionString>Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=CRM;Data Source=MySQLServer;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False</udc:ConnectionString>   
   <udc:OperationName></udc:OperationName>   
   <udc:ServiceUrl>http://</udc:ServiceUrl>   
   <udc:SoapAction></udc:SoapAction>   
   <udc:Query>select "id", "title" from "dbo"."customerdata" as "customerdata"</udc:Query> 
   </udc:SelectCommand>
   </udc:ConnectionInfo>
</udc:DataSource>

Die Neuanlage der Data Connection auf Basis der neuen Datei führt zu folgender Änderung in der manifest.xsf:

<xsf2:dataConnections>
   <xsf2:adoAdapterExtension ref="customerdata">
       <xsf2:connectoid connectionLinkType="relative" source="Data Connections/customerdata.udcx" siteCollection="http://moss.litwareinc.com/sites/crm/" name="customerdata.udcx"></xsf2:connectoid>
   </xsf2:adoAdapterExtension>
</xsf2:dataConnections>

Und schon steht einer Datenquelle im udcx-Format nichts mehr im Wege...