【问题标题】:no parameterless constructor defined for this object in C# using Sqlite-net ExecuteQuery method没有使用 Sqlite-net ExecuteQuery 方法在 C# 中为此对象定义无参数构造函数
【发布时间】:2019-09-13 16:06:37
【问题描述】:

我正在使用 Sqlite-net 处理 C# 应用程序。我的查询应该返回一个单列值,但是当我运行查询时,我得到了异常。我的代码是:

foreach(var group in groups)
{   
    var groupNameCmd = EdgeDatabase._connection.CreateCommand(@"SELECT Name from tblGroup WHERE Id = " + group.Id);
    List<string> groupName = groupNameCmd.ExecuteQuery<string>();
}

在“ExecuteQuery”我得到异常“没有为此对象定义无参数构造函数”。

【问题讨论】:

  • 如果您使用的是.net core 2.0,请检查您的包引用,如果您的包引用和sdk安装的版本不匹配,通常会出现此错误。
  • 也许你不能使用string作为目标类型。您是否尝试过使用名为Name 的字符串类型属性创建一个类并使用该类型代替&lt;string&gt;
  • 没错,不能使用"string",但是找不到原因和解决方法。 @Crowcoder
  • 这是因为String上没有无参构造函数。像这样的工具使用反射,它没有任何东西可以用作构造函数参数。我提到了一个解决方案,使用另一种类型。

标签: c# sqlite-net


【解决方案1】:

由于 akg179 的当前答案被否决,我写下我的答案,因为我刚刚遇到了同样的问题。

您不能返回缺少无参数构造函数的类型(如字符串)。在这种情况下甚至无法进行投影(使用 LINQ)。

要仅选择特定列(或多个列),您仍然必须在方法调用中使用正确的类型(使用泛型类型):

foreach(var group in groups)
{   
    var groupNameCmd = EdgeDatabase._connection.CreateCommand(@"SELECT Name from tblGroup WHERE Id = " + group.Id);
    List<YourTblGroupType> groupName = groupNameCmd.ExecuteQuery<YourTblGroupType>();
}

您现在将获得 YourTblGroupType 列表,但只会设置 Name 属性。

如果你真的只想要字符串列表,你仍然可以在之后使用以下 lambda 表达式:

List<string> names = groupName.Select(p => p.Name).ToList()

【讨论】:

    【解决方案2】:

    您在创建 SQL 命令时使用了group.Id。这个group 应该是一个类的实例。

    检查group 是其实例的类中是否存在无参数构造函数。如果没有,请尝试向该类添加无参数构造函数。

    【讨论】:

    • 组 ?? @akg179
    • 我在第二行 @akg179 上收到此异常
    • 不,我正在循环运行这个查询,原始代码已经更新
    • 看到你更新的代码,group 变量仍然包含某个类的实例。 groups 是此类实例的集合。 groups的数据类型是什么?
    • var groups = EdgeDatabase._connection.Table().ToList();这是组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2011-03-29
    • 2016-04-25
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多