“必须声明标量变量“ @SKU”。”

时间:2019-04-07 09:27:42

标签: c# sql dapper

我正在使用dapper插入数据库,一直在查看我的代码以查找已发生的事情,找不到与众不同的东西。

该代码与SELECT语句一起使用,但在我插入时不起作用 我总是会收到错误:

  

System.Data.SqlClient.SqlException:'必须声明标量变量   “ @SKU”。

当我从数据库,类,函数和过程中删除第一个参数时,总是会遇到相同的错误。

public class Products
{
    public string SKU;
    public string Title;
    public string ImageLink;
}

使用dapper函数插入

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);
    }
}

过程:

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

数据库:

CREATE TABLE [dbo].[ProductsTable] (

[SKU]       NCHAR (10)  NULL,
[Title]     NCHAR (100) NULL,
[ImageLink] NCHAR (50)  NULL
);

错误发生在激励行上。

2 个答案:

答案 0 :(得分:2)

Dapper需要属性,而不是字段;尝试:

public class Products
{
    public string SKU {get;set;}
    public string Title {get;set;}
    public string ImageLink {get;set;}
}

,然后重试;您只需要传递单个对象-此处不需要列表。如果您选择(如MarcinJ所述),则可以使用CommandType.StoredProcedure方法将其组合(但请注意,MarcinJ指出),但要注意,这会交换通过 positional 参数(在原始问题中) )传递给命名参数-因此请务必检查并确保其含义不变。

答案 1 :(得分:1)

使用Dapper调用存储过程的方法是:

connection.Execute("Item_Insert", dbnewProduct, commandType: CommandType.StoredProcedure);

此外,您不需要列表,只需在此处使用newProduct