我正在尝试使用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; }
}
答案 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);