Tabellenwertparameter an Stored Procedure über Mandantenobjekt übergeben

khk

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
 
Zurück
Oben