Ich versuche, Daten mit einer gespeicherten Prozedur aus einem C # -Programm, das Dapper verwendet, in meine SQL Server-Datenbank einzufügen. Wenn ich dies versuche, erhalte ich keine Fehlermeldung, aber einige Daten werden leider in die falsche Spalte eingefügt.
Die Datenbank besteht aus vielen Tabellen und Spalten. Daher wird eine gespeicherte Prozedur verwendet, um Daten korrekt einzufügen. Ich habe die gespeicherte Prozedur in SQL Server selbst ausgiebig getestet und weiß sicher, dass die Daten korrekt platziert werden, wenn SQL-Code direkt auf dem Server ausgeführt wird.
Hier ist der Code, der die gespeicherte Prozedur aufruft, und einen winzigen Teil des Skripts der gespeicherten Prozedur.
public void AddIndividual(string genus, string species, string collection)
{
using (IDbConnection connection = new SqlConnection(connectionString: Helper.CnnVal("Rapento.Properties.Settings.Database1ConnectionString")))
{
List<Individual> individual = new List<Individual>();
individual.Add(new Individual { GivenGenusName = genus, GivenSpeciesName = species, GivenCollectionName = collection });
connection.Execute("dbo.AddIndividual @GivenGenusName, @GivenSpeciesName, @GivenCollectionName", individual);
}
}
CREATE PROCEDURE AddIndividual
@GivenGenusName varchar(255) = null,
@GivenSpeciesName varchar(255) = null,
@GivenDeterminedBy varchar(255) = null,
@GivenDeterminationDate varchar(255) = null,
....
@GivenCollectionName varchar(255) = null,
In der Datenbank kann ich sehen, dass GenusName
und SpeciesName
korrekt eingefügt wurden, aber CollectionName
in die Spalte DeterminedBy
eingefügt wird. So wird es nicht in das SQL-Skript geschrieben. Ich möchte darauf aufmerksam machen, dass DeterminedBy
der dritte Parameter im Skript ist. Ich denke also, dass die Parameter nicht anhand der Namen weitergegeben werden, die ich ihnen gebe, sondern anhand ihrer Position (der Reihenfolge, in der ich sie übergeben).
Meine Frage ist also: Wie kann ich diesen Parameter in die richtige Spalte einfügen, ohne jeden einzelnen optionalen Parameter in der Prozedur übergeben zu müssen?
Ich hoffe, ich habe dir alle Informationen gegeben, die du brauchst. Vielen Dank!
Wenn Sie eine gespeicherte Prozedur wie oben beschrieben ausführen:
connection.Execute("dbo.AddIndividual @GivenGenusName, @GivenSpeciesName, @GivenCollectionName", individual);
... Sie liefern eine Liste von Werten und keine Parameterliste . Wenn Sie Parameter in der gespeicherten Prozedur überspringen, müssen Sie die Namen der Parameter angeben, die Sie füllen, wie folgt ( Annahme: Die Parameternamen sind mit den Namen der Variablen identisch )
connection.Execute("dbo.AddIndividual @GivenGenusName = @GivenGenusName, @GivenSpeciesName = @GivenSpeciesName, @GivenCollectionName = @GivenCollectionName", individual);
Wenn Sie nur Werte angeben, werden diese mit dem ersten Parameter gefüllt. Dies ist, was Ihre Anfrage macht. Die Verwirrung besteht hauptsächlich darin, dass die von Ihnen festgelegten Werte als Variablen und nicht als Parameter behandelt werden.