Tabellenwertparameter an Stored Procedure über Mandantenobjekt übergeben

Dieses Thema im Forum ".NET (sagede.* DLLs)" wurde erstellt von khk, 17. Juli 2019.

  1. khk

    khk Neues Mitglied

    Hallo zusammen,

    ich möchte optimalerweise an jeder Stelle das Mandantenobjekt nutzen, damit ich keine separate Datenbankverbindung öffnen muss.

    I. d. R. funktioniert das ohne Probleme. Nun möchte ich allerdings eine Stored Procedure aufrufen, die als Parameter einen Tabellenwertparameter verlangt. Mein Code sieht wie folgt aus (bitte nicht beachten, ob die Daten für die Tabelle KHKArtikel "sinnvoll" sind oder nicht - es geht nur um das Ausführen der SP).

    SQL-Befehle zum Erstellen des benutzerdefinierten Tabellentyps + Stored Procedure:
    Code:
    CREATE TYPE [dbo].[MyCustomDefinedTableType] AS TABLE(
        [Mandant] [smallint] NOT NULL,
        [Artikelnummer] [varchar](31) NOT NULL
    )
    GO
    
    Code:
    CREATE PROCEDURE spXXXAddArticlesHighSpeed
        @ArticleData MyCustomDefinedTableType READONLY
    AS
        BEGIN
            INSERT INTO dbo.KHKArtikel (Mandant, Artikelnummer)
            SELECT
                ad.Mandant,
                ad.Artikelnummer
            FROM @ArticleData AS ad;
        END
    GO
    C#-Klasse für benutzerdef. Tabellentyp:
    Code:
    public class ArticleData
    {
        public ArticleData(short mandantId, string artikelnummer)
        {
            Mandant = mandantId;
            Artikelnummer = artikelnummer;
        }
        public string Artikelnummer { get; }
        public short Mandant { get; }
    }
    C#-Aufruf der Stored Procedure:
    Code:
    List<ArticleData> articlesData = new List<ArticleData> {
        new ArticleData(mandant.Id, "Artikel1"),
        new ArticleData(mandant.Id, "Artikel2")
    };
    var cmd = var command = mandant.MainDevice.GenericConnection.CreateStoredProcCommand();
    cmd.CommandText = "spXXXAddArticlesHighSpeed";
    cmd.AppendInParameter("ArticleData", typeof(DataTable), articleData.AsDataTable());
    cmd.ExecuteNonQuery();
    Ich erhalte folgenden Fehler:
    Code:
    Operandentypkollision: varchar ist inkompatibel mit MyCustomDefinedTableType
    Wahrscheinlich rührt der Fehler daher, dass er den Typ DataTable nicht verarbeiten kann?

    Wenn ich statt dem Mandantenobjekt eine SqlDbConnection nutze, funktioniert alles tadellos, da ich hier als Parametertyp "SqlDbType.Structured" angeben kann. In der Mandantenverbindung habe ich nicht die Möglichkeit dazu, weil alle ADO-Funktionen und -Typen mit Sage-eigenen Funktionen überschrieben werden.

    Gibt es dennoch eine Möglichkeit, dazu das Mandantenobjekt zu nutzen? Das iterative Einfügen der Artikel dauert viel zu lange bei ca. 10k Datensätzen.

    Vielen Dank & nette Grüße
    khk
     

Diese Seite empfehlen