c# - Dapper - <>f__AnonymousType.....类型的成员不能用作参数值
问题描述
我正在尝试执行返回返回值的存储过程。
但我收到错误消息:
2021-06-23 14:02:37.844 +02:00 [ERR] <>f__AnonymousType0`3[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089] 类型的成员,[ System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]不能作为参数值
List<Person2> persons = new List<Person2>()
{
new Person2() { Id = 22, FirstName = "Calvin", LastName = "Kattar" },
new Person2() { Id = 23, FirstName = "Edson", LastName = "Barboza" }
};
using (IDbConnection connection = new OracleConnection(GetConnectionString()))
{
try
{
var personProjections = persons.Select(x => new { id = x.Id, first_name = x.FirstName, last_name = x.LastName, out_message = x.OutMessage});
var results = connection.Query<Person2>("kwc_test_person_procedure2",
new { personProjections },
commandType: CommandType.StoredProcedure
);
}
catch (Exception ex)
{
Log.Error(ex.Message);
Log.Error(ex.StackTrace);
throw;
}
}
我的类型是:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Person2 : Person
{
public string OutMessage { get; set; }
}
和存储过程:
create or replace procedure kwc_test_person_procedure2(
id in number,
first_name in varchar2,
last_name in varchar2,
out_message out varchar2
) is
begin
insert into kwc_test_person(id, first_name, last_name) values (id, upper(first_name), upper(last_name));
out_message := 'The person-ID ' || id || ' has been inserted to database on ' || sysdate;
End kwc_test_person_procedure2;
我在这里做错了什么?
提前致谢!
解决方案
Query(...)的参数param类型错误。它必须是一个平面对象,该对象具有您正在调用的过程的每个参数的属性或字段。像这样的东西会起作用:
connection.Query("kwc_test_person_procedure2",
new { id = 1, first_name = "...", ...},
commandType: CommandType.StoredProcedure
由于您想为多人实例调用该过程,因此您的代码应如下所示:
foreach(var personProjection in persons.Select(x => new { id = x.Id, first_name = x.FirstName, last_name = x.LastName, out_message = x.OutMessage})
{
connection.Query("kwc_test_person_procedure2",
personProjection,
commandType: CommandType.StoredProcedure);
}
至于过程的返回值,我不确定它是否在 Oracle 中是这样工作的;在 MSSQL 中,返回值将是过程中最后一次选择的结果。看起来它在 oracle 中可能是相同的,请参阅this。
推荐阅读
- ruby-on-rails-4 - ruby on rails 数据库中的自定义 SMTP 设置?
- sql - ORACLE如何使用RANK函数
- javascript - 具有不同时刻的谷歌图表时间轴
- parse-platform - 具有不同指针的列 Parse.Com
- python - 重构:合并两个字典,但忽略 None 值
- python - Groupby 两列值并创建一个唯一的 id
- css - .ttf 格式是否足以指定具有字体规则的字体?
- python - 为什么使用静态输入变量的有限差分来计算雅可比?(OpenMDAO 2.4)
- firebase - Firestore 安全规则:仅当新文档 ID 与用户 ID 相同时才允许用户创建文档
- android - 日期错误的三星 SM A550W HTTPS ExtCertPathValidatorException