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:
C#-Klasse für benutzerdef. Tabellentyp:
C#-Aufruf der Stored Procedure:
Ich erhalte folgenden Fehler:
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
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
Code:
public class ArticleData
{
public ArticleData(short mandantId, string artikelnummer)
{
Mandant = mandantId;
Artikelnummer = artikelnummer;
}
public string Artikelnummer { get; }
public short Mandant { get; }
}
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
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