【问题标题】:Dapper with SQLite and C# Error "Insufficient parameters supplied to the command"带有 SQLite 和 C# 错误“提供给命令的参数不足”的 Dapper
【发布时间】:2019-06-21 09:22:02
【问题描述】:

自原始帖子以来的新信息。这段代码成功地检索了一个实体,这让我认为 QueryMultiple 映射不同于 Query。这是真的吗?

 using (var multi = sqlConn.QueryMultiple(sqlStmt, new { MytableId = mytableinstance.MytableId }))
 {
    var fullEnt = multi.Read<MytableSource>();
 }

我要做的是使用 Dapper 根据父表的 FK 列值查询子表,以 SQLite 作为数据库。下面的代码给了我错误

提供给命令的参数不足

谁能指出我的错误?

注意 - 我也在使用 Dapper.Contrib。 .NET 框架 4.7.2。

谢谢。


PRAGMA foreign_keys = '1';

CREATE TABLE "Mytable" (
    "MytableId" INTEGER Primary Key AutoIncrement,
    "MytableName"   TEXT UNIQUE,
    "Stamp" TEXT 
);


CREATE TABLE "MytableSource" (
    "MytableSourceId"   INTEGER Primary Key AutoIncrement,
    "MytableId" INTEGER,
    "SourceBlob"    BLOB,
    "Stamp" TEXT,
    FOREIGN KEY("MytableId") REFERENCES "Mytable"("MytableId")

);

    [Table("Mytable")]
    public class Mytable
    {
        [Key]
        public long MytableId { get; set; }

        public String MytableName { get; set; }

        public String Stamp { get; set; }
    }

    [Table("MytableSource")]
    public class MytableSource
    {
        [Key]
        public long MytableSourceId { get; set; }

        public long MytableId { get; set; }

        public String SourceBlob { get; set; }

        public String Stamp { get; set; }
    }

    var sqlStmt = "Select * From MytableSource Where MytableId = @MytableId";
                var sqlConn = new SQLiteConnection( this.ConnectionString );
                using ( sqlConn )
                {
                    sqlConn.Open();
                    var fullEnt = sqlConn.Query<MytableSource>(sqlStmt, new SQLiteParameter("@MytableId" , mytableinstance.MytableId )).FirstOrDefault();
                    this.MytableSourceCurrent = fullEnt;

                }

未知错误 提供给命令的参数不足

【问题讨论】:

  • 试试new SQLiteParameter("MytableId", ...)吧?
  • @LasseVågsætherKarlsen 我试过了(删除@)并得到了相同的结果。谢谢。
  • .Query&lt;MytableSource&gt;(sqlStmt, new { MytableId = mytableinstance.MytableId }) 呢?
  • 虽然问题中的示例看起来不错,但我的问题是由于linkSQLite parameter names are case-sensitive. Ensure that the parameter names used in SQL match the case of the anonymous object's properties. 中提到的 Dapper 限制我的类属性名称的大小写与参数的大小写不同。

标签: c# sqlite dapper system.data.sqlite


【解决方案1】:

我查看了 GitHub 上的原始代码,搜索了Query&lt; T &gt;,仅通过几种方法手动追踪。尽管它是高度抽象的并且文档很少,但代码本身至少表明需要一个 IEnumerable 对象。它似乎更喜欢集合的 Dapper.IDynamicParameters 对象,但除此之外,不值得通过代码来获取更多详细信息。

这在测试中对我有用:

var parameters = new DynamicParameters();
param.Add("@MytableId" , mytableinstance.MytableId);
var fullEnt = sqlConn.Query<MytableSource>(sqlStmt, parameters ).FirstOrDefault();

【讨论】:

  • 感谢您深入研究。我还是不明白为什么GET不接受外键参数,只使用PK,如果我想使用FK查询,需要完整的SQL语句。如果我必须编写一个完整的 SQL 语句,我会丢失大部分 ORM 值。显然不是你的错,我再次感谢你的检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多