Dapper-“必须声明标量变量@VersionId”

时间:2018-11-28 09:59:18

标签: c# sql asp.net dapper

我正在尝试使用Dapper对本地计算机上可用的数据库执行一些简单查询。

大多数查询工作正常,但是当我尝试将对象插入数据库中对应的表时,得到了SqlException。我有一个类似的insert方法,该方法首先在方法主体内实例化一个对象,然后将其插入数据库,该方法可以正常工作。但这不是。更具体地说,这是来自异常的响应:

System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@VersionId".'

以下是产生异常的调用代码:

public int CreateNewSchema(Schema schema)
        {
            string sql = "INSERT INTO Schemas(VersionId, Created, Updated, SchemaData) " +
                         " values (@VersionId, @Created, @Updated, @SchemaData);";

            var affectedRows = _connection.Execute(sql, new{schema});
            return affectedRows;
        }

我数据库中对应的Schema表具有以下设计。

Schema 
ID             int
VersionID      nvarchar(max)
Created        datetime2(7)
Updated        datetime2(7)
SchemaData     nvarchar(max)

最后,我尝试插入此表中的POCO对象的定义如下:

public class Schema
    {
        public int ID { get; set; }
        public string VersionId { get; set; }
        public DateTime Created { get; set; }
        public DateTime Updated { get; set; }
        public string SchemaData { get; set; }
    }

2 个答案:

答案 0 :(得分:5)

直接传递对象:

var affectedRows = _connection.Execute(sql, schema);

Dapper分析传递对象的属性。

您传递的对象只有一个属性schema。因此@schema将是您在查询中获得的唯一变量。如果按原样传递对象,而不是作为另一个对象的一部分传递,则将获得与Schema对象属性相对应的变量。

答案 1 :(得分:3)

您传递了一个对象,该对象包含名为schema的属性,其值是架构对象。

Dapper使用反射来查找属性名称,并将其与查询中的参数匹配。您不需要需要创建一个匿名类型。

为了方便起见,使用匿名类型以避免创建仅传递一些参数的常规类型。在Dapper,ASP.NET MVC,LINQ和需要传递一堆属性但又不想创建新类型的任何地方,该方法已得到广泛使用。

只需传递模式对象:

var affectedRows = _connection.Execute(sql, schema);