SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




gespeicherte Prozedur mit Visual Basic Code durch InfoPath Formular ausführen

Geprüfte Antwort Dieser Beitrag hat 6 Antworten

Ohne Rang
9 Beiträge
Sigole erstellt 29 Juli 2015 09:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Einen wunderschönen guten Morgen an alle,

 

ich habe ein gespeicherte Prozedur in einer MSSQL Datenbank erstellt und möchte diese jetzt mit folgendem Visual Basic Code den ich exakt so nach gestellt wie hier

 http://www.bizsupportonline.net/infopath2007/use-receive-data-connection-execute-sql-server-stored-procedure.htm

ausführen. Dabei sollen die eingegebenen Daten aus einem InfoPath Formular 2010 anschließend in der Datenbank gespeichert werden. Die Datenbank Tabelle wurde mit dem Datenverbindungsassistent in InfoPath zu Share Point verbunden. Die Formularbibliotheken wurden in SharePoint2010 angelegt und die Daten die in das Formular eingetragen, danach sollen diese dann durch eine empfangene Verbindung zur Datenbank gesendet werden.

Leider wird der Code nicht richtig ausgeführt und es kommt ständig eine Fehlermeldung beim debuggen, dass das Formular nicht übermittelt werden kann.

Zitat: “Das Formular kann von InfoPath nicht abgesendet werden. Die vom Ereignishandler für „On Submit Request“ erhaltene Rückgabewert zeigt an dass der Versende Vorgang fehlgeschlagen ist.

Hier der Code

using Microsoft.Office.InfoPath;

using System;

using System.Xml;

using System.Xml.XPath;

using System.Diagnostics;

 

namespace Form_Geschäftl_Bereich

{

    public partial class FormCode

    {

        public void InternalStartup()

        {

            EventManager.FormEvents.Submit += new SubmitEventHandler(FormEvents_Submit);

        }

 

        public void FormEvents_Submit(object sender, SubmitEventArgs e)

        {

            string n = "infopaath";

 

 

 

 

            AdoQueryConnection connection = (AdoQueryConnection)(this.DataConnections["Test"]);

            connection.Command = "EXEC Testprozedur '" + n + "'";

            connection.Execute();

            connection.Command = originalCommand;

        }

    }

}

 

 

 

 

Für Tipps wäre ich sehr dankbar!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Juli 2015 09:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Warum machst Du das überhaupt per Code? InfoPath kann auch selbst Daten an eine Datenverbindung senden.

Ansonsten sehe ich hier aus der Ferne einige mögliche Fehlerquellen:

Du rufst eine Stored Procedure "infopaath" mit genau diesem Schreibfehler auf. Gibt es die?

Du rufst die Stored Procedure ohne weitere Parameter auf. Ist das in Ordnung?

Was macht die letzte Zeile in Deinem Code (connection.Command = originalCommand)? Wo ist originalCommand definiert?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
9 Beiträge
Sigole Als Antwort am 29 Juli 2015 10:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Weil InfoPath zu wenig kann bzw es einfacher ist, die ganzen Regeln, die beachtet werden müssen, in SQL zu schreiben.

"infopaath" ist die Variable n, die als Parameter an die gespeicherte Prozedur übergeben wird.

In der Prozedur wird per insert der übergebene Parameter in eine Tabellenspalte eingefügt.

--> In MS-SQL-Studio funktioniert das auf jeden Fall

 

Irgendwie kann InfoPath aber nicht diese empf. Datenverbindung nutzen um auf die SQL-DB zuzugreifen. 

Auch wenn ich die gespeicherte Prozedur weglasse, kommt die gleiche Meldung, dass " das Formular von InfoPath nicht abgesendet werden kann"  bzw passiert einfach nichts.

 

Die letzte Zeile setzt das AdoQueryConnection-Objekt wieder auf die empfangende DB-Verbindung. Es wird ja eine empfangende DB-Verbindung genutzt um die gespeicherte Prozedur aufzurufen...   

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Juli 2015 10:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Stimmt, die Sache mit dem Parameter habe ich falsch interpretiert :-(

Versuche doch mal, nicht die vordefinierte Verbindung zu nutzen, sondern einfache selbst ein aufzubauen. Testweise mit fest codiertem Connectionstring.

Dann gibt es noch die Problematik mit der Authentifizierung. Was verlangt denn der Datenbankserver? Man kann nicht so einfach den angemeldeten Benutzer an die Datenbank weiterreichen. Google mal nach double hop problem für mehr Informationen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
9 Beiträge
Sigole Als Antwort am 29 Juli 2015 17:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für den Tipp mit dem ConnectionString.

Das hab ich ausprobiert, und weiß mittlerweile, dass es wirklich ein Permission-Problem ist.

Der DB-Server verlangt Windows-Authentifizierung (NT-Authentifizierung?). Das ist der VisualCode dazu:

Dim con As New SqlClient.SqlConnection

 

            Dim strCon As String = "Data Source=PTCSPDB;Initial Catalog=Content_HTW;Integrated Security=SSPI;Connection Timeout=10;" 'NT Authentication

 

            'For SQL Authentication

            'Dim strCon As String = "Data Source=PTCSPDB\SQLEXPRESS;Initial Catalog=DATABASENAME;User ID=USERNAME;Password=PASSWORD;Connection Timeout=50;"

 

 

 

 

            Dim strCommand As String = "SELECT * FROM Test"

            Dim command As SqlCommand

            Dim da As SqlDataAdapter

            Dim dt As New DataTable

            Try

                con.ConnectionString = strCon

                command = New SqlCommand(strCommand, con)

                command.CommandTimeout = 3000

 

                da = New SqlDataAdapter(command)

                da.Fill(dt)

                MsgBox(dt.Rows.Count.ToString())

 

 

 

                'FOR INSERT, UPDATE, DELETE, USE BELOW

 

                'Dim count as Integer = command.ExecuteNonQuery()

 

                'count is the affected row number

 

            Catch ex As Exception

                MessageBox.Show(ex.Message, "ERROR")

            Finally

                If con.State = ConnectionState.Open Then

                    con.Close()

                End If

            End Try

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Juli 2015 08:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das nennt sich wie gesagt das Double Hop Problem -> Google

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
9 Beiträge
Sigole Als Antwort am 30 Juli 2015 14:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jetzt habe ich es doch hinbekommen, es lag unteranderem an einer Benutzerberechtigung und am Connection String.

Vielen Dank für deine Mühen Andi, du hast mir sehr geholfen!!!