簡體   English   中英

從 Dapper QueryAsync 接收 null 值返回 cursor

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM