Получение нулевых значений из Dapper QueryAsync возвращает курсор - PullRequest
0 голосов
/ 24 октября 2019

У меня проблема с одним из моих вызовов dapper, возвращающим курсор со всеми данными столбца как null.

У нас есть несколько вызовов, которые выглядят идентично этому, которые возвращают списокпредоставленной модели. Я все еще знакомлюсь с C #, .Net и Dapper, поэтому может быть что-то простое, что мне не хватает.

Наша хранимая процедура SQL ожидает:

Procedure ListItemGrid(pUserId     in number,
                       pListType   in varchar2,
                       pSearchTerm in varchar2,
                       pId         in varchar2,
                       pOut        out sys_refcursor
                       )

The Dappercall:

        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:

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 для всех значений?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Позвольте мне начать с цитирования этой статьи:

Стандарты SQL: 2008 и SQL-99 определяют базы данных как нечувствительные к регистру для идентификаторов, если они не указаны в кавычках. Символы нижнего регистра могут использоваться в идентификаторах и ключевых словах, но считаются их аналогами верхнего регистра.

Я вижу, что вы используете базу данных Oracle. Oracle соответствует вышеупомянутым стандартам. Я не могу увидеть определение вашей хранимой процедуры, но если ваша хранимая процедура была определена двойными кавычками вокруг имен полей, то они будут считаться чувствительными к регистру / заглавными буквами. Это вполне может иметь место.

Итак, ваше собственное решение с верхним регистром имен столбцов имеет смысл.

0 голосов
/ 24 октября 2019

После некоторых проб и ошибок изменилось:

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 был получен из функции, которую мы имелинаписано и написано так, что не учитывает регистр.

...