Dapper-将空值插入到MySql表中

时间:2019-10-04 13:07:54

标签: mysql dapper

经过数小时的尝试找出问题所在后,我仍然陷入困境。这是问题所在:

我的C#代码中有一个MySql查询:

var sql = "INSERT INTO MEMBERS(Salutation, FirstName, LastName) VALUES(?salutation, ?firstName, ?lastName)";

此查询使用的方法可以接受ExpandoObject:

public async Task AddMember(ExpandoObject expando)
{
    var sql = "INSERT INTO MEMBERS(Salutation, FirstName, LastName) VALUES(?salutation, ?firstName, ?lastName)";

    // Convert the incoming ExpandoObject to Dapper's DynamicParameters
    // https://stackoverflow.com/questions/9481678/how-to-create-arguments-for-a-dapper-query-dynamically
    if (expando != null)
    {
        var dbArgs = new DynamicParameters();

        foreach (var param in expando)
        {
            dbArgs.Add(param.Key, param.Value);
        }

        await mySqlConnection.ExecuteAsync(sql, dbArgs);
    }
}

查询正在执行(这意味着我没有收到错误,并且在Members表中创建了一行,并且还生成了MemberId列值),但是Salutation,FirstName和LastName为空。

我检查了Expando的内容。输入值都在那里。

我尝试了各种事情。

  • 使用@和:代替?在查询中。
  • 直接在QueryAsync中使用Expando,而不是将其转换为DynamicParameters。
  • 使用IDictionary作为输入而不是ExpandoObject,并将其直接传递给QueryAsync。
  • 使用QueryAsync而不是ExecuteAsync。

没有任何效果。每次3列均为空。不知道这里出了什么问题。

由于多种原因,我不能使用像Member这样的强类型作为此方法的输入。我必须用 一个ExpandoObject。

  • 我正在使用的MySql版本是5.7.13
  • 我的Dapper版本是1.60.6
  • 我正在使用的MySql.Data nuget软件包是8.0.17

1 个答案:

答案 0 :(得分:1)

好的,这是基于我们上面讨论的理论。我会扩展您的DynamicParameters,以便您也传递DBType值。

例如:(来源:https://dapper-tutorial.net/parameter-dynamic

parameter.Add("@Kind", InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input);
parameter.Add("@Code", "Many_Insert_0", DbType.String, ParameterDirection.Input);
parameter.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

因此,在您的情况下,可能类似于:

public async Task AddMember(ExpandoObject expando)
{
    var sql = "INSERT INTO MEMBERS(Salutation, FirstName, LastName) VALUES(@salutation, @firstName, @lastName)";

    // Convert the incoming ExpandoObject to Dapper's DynamicParameters
    // https://stackoverflow.com/questions/9481678/how-to-create-arguments-for-a-dapper-query-dynamically
    if (expando != null)
    {
        var dbArgs = new DynamicParameters();

        foreach (var param in expando)
        {
            dbArgs.Add(param.Key, param.Value, DbType.String, ParameterDirection.Input);
        }

        await mySqlConnection.ExecuteAsync(sql, dbArgs);
    }
}

我知道这会降低您尝试执行此操作的动态方式(通过对类型和方向进行硬编码),但是您可以将其添加到初始Expando中,以允许设置和传递此值到AddMember方法。