[英]Receiving null values from Dapper QueryAsync returned cursor
我的一個簡潔調用返回 cursor 並且所有列數據為null
。
我們有幾個看起來與這個相同的調用,它們返回提供的 model 的列表。 我仍然熟悉 C#、.Net 和 Dapper,所以我可能缺少一些簡單的東西。
我們的 SQL 存儲過程期望:
Procedure ListItemGrid(pUserId in number,
pListType in varchar2,
pSearchTerm in varchar2,
pId in varchar2,
pOut out sys_refcursor
)
小巧玲瓏的電話:
public async Task<List<ListItem>> ListItemGrid(string id, string listType = null, string searchTerm = null)
{
using (var conn = this.GetConnection())
{
var p = new OracleDynamicParameters();
p.Add("pUserId", value: this.userResolverService.UserId, dbType: OracleDbType.Double, direction: ParameterDirection.Input);
p.Add("pListType", value: listType, dbType: OracleDbType.Varchar2, size: 4000, direction: ParameterDirection.Input);
p.Add("pSearchTerm", value: searchTerm, dbType: OracleDbType.Varchar2, size: 4000, direction: ParameterDirection.Input);
p.Add("pId", value: id, dbType: OracleDbType.Varchar2, size: 4000, direction: ParameterDirection.Input);
p.AddCursor("pOut");
var itemList = await conn.QueryAsync<ListItem>("SQL_PKG.ListItemGrid", param: p, commandType: CommandType.StoredProcedure);
return itemList.AsList();
}
}
其中SQL_PKG.ListItemGrid
返回與ListItem
model 形狀相同的 cursor:
using System;
using Proj.Name.Infrastructure.DataAccess;
namespace Proj.Name.Models
{
public class ListItem
{
[Column("name")]
public string name { get; set; }
[Column("other_column")]
public string other { get; set; }
[Column("third_column")]
public string third { get; set; }
...
}
}
預期:包含我們數據庫中的值的ListItem
列表。
[
{
key: "string value",
keyTwo: "other string value",
...
},
{ ... },
{ ... }
]
實際:具有正確長度的ListItem
列表,其中包含ListItem
中的鍵,但每個值的鍵為null
。
[
{
key: null,
keyTwo: null,
...
},
{ ... },
{ ... }
]
為什么我得到所有值的null
?
經過一些試驗和錯誤,改變:
using System;
using Proj.Name.Infrastructure.DataAccess;
namespace Proj.Name.Models
{
public class ListItem
{
[Column("name")]
public string name { get; set; }
[Column("other_column")]
public string other { get; set; }
[Column("third_column")]
public string third { get; set; }
...
}
}
大寫:
using System;
using Proj.Name.Infrastructure.DataAccess;
namespace Proj.Name.Models
{
public class ListItem
{
[Column("NAME")]
public string name { get; set; }
[Column("OTHER_COLUMN")]
public string other { get; set; }
[Column("THIRD_COLUMN")]
public string third { get; set; }
...
}
}
修復了我的問題。
這仍然令人困惑,因為我們的其他模型/dapper 調用正在工作並且是小寫的。 如果有人知道為什么這不一致,請告訴我。
更新:我沒有意識到Column
是從我們編寫的 function 提供的,並且是以不區分大小寫的方式編寫的。
讓我從這篇文章中引用開始:
SQL:2008 和 SQL-99 標准將數據庫定義為對標識符不區分大小寫,除非它們被引用。 小寫字符可以用在標識符和關鍵字中,但被認為是它們的大寫字符。
我看到您使用的是 Oracle 數據庫。 Oracle 符合上述標准。 我看不到您的存儲過程定義,但如果您的存儲過程是在字段名稱周圍使用雙引號定義的,那么它們將被視為區分大小寫/大寫。 很可能就是這種情況。
因此,您自己的將列名大寫的解決方案確實有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.