J'utilise dapper pour insérer dans une base de données, j'ai regardé mon code pour trouver ce qui s'est passé, je n'ai rien trouvé d'extraordinaire.
Le code fonctionne avec l'instruction SELECT, mais pas lorsque je fais une insertion, j'obtiens toujours l'erreur:
System.Data.SqlClient.SqlException: 'Doit déclarer la variable scalaire "@SKU".
Lorsque je supprime le premier paramètre de la base de données, la classe, la fonction et la procédure, j'obtiens toujours la même erreur pour le premier paramètre.
public class Products
{
public string SKU;
public string Title;
public string ImageLink;
}
Utilisation de la fonction dapper pour insérer:
public void insertItem(Products newProduct)
{
using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("SellersDB")))
{
List<Products> dbnewProduct = new List<Products>();
dbnewProduct.Add(newProduct);
connection.Execute("dbo.Item_Insert @SKU, @Title, @ImageLink", dbnewProduct);
}
}
La procédure:
CREATE PROCEDURE [dbo].[Item_Insert]
@SKU nchar(10),
@Title nchar(100),
@ImageLink nchar(50)
AS
BEGIN
SET NOCOUNT ON;
insert into dbo.ProductsTable (SKU, Title, ImageLink) values (@SKU, @Title, @ImageLink);
END
La base de données:
CREATE TABLE [dbo].[ProductsTable] (
[SKU] NCHAR (10) NULL,
[Title] NCHAR (100) NULL,
[ImageLink] NCHAR (50) NULL
);
L'erreur s'est produite sur la ligne d'excitation.
Dapper veut des propriétés, pas des champs; essayer:
public class Products
{
public string SKU {get;set;}
public string Title {get;set;}
public string ImageLink {get;set;}
}
et essayez à nouveau; il vous suffit de passer le seul objet - vous n'avez pas besoin d'une liste ici. Vous pouvez combiner cela avec l'approche CommandType.StoredProcedure
si vous choisissez (comme noté par MarcinJ) - mais veillez à ce que cela échange le passage du paramètre positionnel (dans la question d'origine) au passage du paramètre nommé - assurez-vous donc de vérifier que cela ne fonctionne pas changer le sens.
La façon d'appeler une procédure stockée avec Dapper est la suivante:
connection.Execute("Item_Insert", dbnewProduct, commandType: CommandType.StoredProcedure);
De plus, vous n'avez pas besoin d'une liste, vous pouvez simplement y utiliser newProduct
.