经过数小时的尝试找出问题所在后,我仍然陷入困境。这是问题所在:
我的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的内容。输入值都在那里。
我尝试了各种事情。
没有任何效果。每次3列均为空。不知道这里出了什么问题。
由于多种原因,我不能使用像Member这样的强类型作为此方法的输入。我必须用 一个ExpandoObject。
答案 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
方法。