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

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

bewertet von 0 Usern
Beantwortet Dieser Beitrag hat 1 Geprüfte Antwort | 6 Antworten | 1 Follower

Ohne Rang
9 Beiträge
Sigole erstellt in 29 Jul 2015 9:10

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!

Beantwortet Geprüfte Antwort

Top-10-Beitragsschreiber
18.902 Beiträge
Verified by Sigole

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

Alle Antworten

Top-10-Beitragsschreiber
18.902 Beiträge

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

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...   

 

Top-10-Beitragsschreiber
18.902 Beiträge
Verified by Sigole

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 auf 29 Jul 2015 17:22

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

 

Top-10-Beitragsschreiber
18.902 Beiträge

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

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
9 Beiträge

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!!!

Seite 1 von 1 (7 Elemente) | RSS