【问题标题】:Dapper - "Must declare the scalar variable @VersionId"Dapper - “必须声明标量变量@VersionId”
【发布时间】:2018-11-28 09:59:17
【问题描述】:

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

大多数查询工作正常,但是当我尝试将一个对象插入到数据库中相应的表中时,我得到一个SqlException。我有一个类似的插入方法,它首先在方法主体中实例化一个对象并将其插入到数据库中,并且该方法工作正常。但是这个没有。更具体地说,这是异常的响应:

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

【问题讨论】:

  • VersionID != VersionId 是这个问题吗?
  • @GeertBellekens 和 SQL 和 Dapper 都不在乎。这不是问题
  • 拼写错误,表中列VersionId与其他声明匹配。
  • @VDWWD 不相关。这是一个关于 Dapper 的问题,它使用反射来提取参数名称和值。

标签: c# sql asp.net dapper


【解决方案1】:

直接传递对象:

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

Dapper 分析传递对象的属性。

您传递的对象只有一个属性schema。所以@schema 将是您在查询中获得的唯一变量。如果您按原样传递对象,而不是作为另一个对象的一部分传递,您将获得您期望的变量,这些变量对应于 Schema 对象属性。

【讨论】:

  • 正确的解决方案,解决了我的问题。谢谢!
【解决方案2】:

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

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

使用匿名类型是为了方便,以避免创建常规类型只是为了传递一些参数。这在 Dapper、ASP.NET MVC、LINQ 以及任何需要传递一堆属性但又不想创建新类型的地方广泛使用。

只需传递架构对象:

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

【讨论】:

  • 太棒了,您的解决方案完美运行。我现在知道未来。谢谢!
  • @Jake12342134 lorond 首先发现了它。我刚刚添加了解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多