精简程序:“提供给命令的参数不足”

时间:2019-09-13 01:50:23

标签: c# sqlite dapper

我有一个Test模型班:

public class Test
{
    public string One;
    public int Two;
}

我有一个test表:

CREATE TABLE "test" 
(
    "one"   TEXT NOT NULL,
    "two"   INTEGER NOT NULL
);

尝试执行此代码时:

using (IDbConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
    con.Execute("INSERT INTO test VALUES (@One, @Two)", new Test
    {
        One = "hello",
        Two = 123
    });
}

我收到此错误:

  

代码=未知(-1),消息= System.Data.SQLite.SQLiteException(0x80004005):未知错误
  提供给命令的参数不足

我尽了一切,找不到原因。

2 个答案:

答案 0 :(得分:1)

Dapper要求.execute()命令的命令参数为“匿名”,“字符串”,“列表”和“动态”,因此不支持传递键入的对象

using (IDbConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
    con.Execute("INSERT INTO test (one, two) VALUES (@One, @Two)", new 
    {
        One = "hello",
        Two = 123
    });
}

使用测试对象。<​​/ strong>

using (IDbConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
    Test tobj = new Test();
    tobj.One = "hello";
    tobj.Two = 123;

    con.Execute("INSERT INTO test (one, two) VALUES (@One, @Two)", tobj);
}

答案 1 :(得分:1)

Dapper不知道如何将您的类分解为两个变量。参见https://github.com/StackExchange/Dapper/issues/540。 您可以在Insert语句中使用1个参数并传递类,也可以在2个参数中传递各个参数,如下所示。

        DynamicParameters parameters = new DynamicParameters();
        parameters.Add("One", Test.One, DbType.String, ParameterDirection.Input);
        parameters.Add("Two", Test.Two, DbType.Int32, ParameterDirection.Input);

        using (IDbConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["database"].ConnectionString))
        {
            con.Execute("INSERT INTO test VALUES (@One, @Two)", parameters);
        }