簡體   English   中英

iSeries 中壓縮十進制在 C# 中對應的數據類型是什么?

[英]What is the corresponding data type in C# for a packed decimal in iSeries?

嘗試編寫一個簡單的 API 來訪問帶有壓縮十進制字段的 Db2 數據庫表。 不轉換值,C#中是否有對應的數據類型? 我不斷收到不匹配的數據類型錯誤。

{“指定的轉換無效。”} 數據:{System.Collections.ListDictionaryInternal} HResult:-2147467262 HelpLink:null InnerException:null 消息:“指定的轉換無效。” 來源:“IBM.Data.DB2.Core” StackTrace:“在 IBM.Data.DB2.Core.DB2DataWrapper.get_Int32Value()\\r\\n 在 IBM.Data.DB2.Core.DB2DataReader.GetInt32(Int32 i)\\r \\n 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable 1.AsyncEnumerator.<MoveNextAsync>d__17.MoveNext()\\r\\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\\r\\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\\r\\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\\r\\n at System.Runtime.CompilerServices.ValueTaskAwaiter 1.GetResult()\\r\\n 在 Microsoft。 EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.d__22 1.MoveNext()\\r\\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\\r\\n at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.<SingleOrDefaultAsync>d__22 d__2Next()1.MoveNext() \\r\\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\\r\\n 在 System.Runtime.CompilerServices.Tas kAw aiter.ThrowForNonSuccess(Task task)\\r\\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\\r\\n 在 System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()\\r\\n at CoreCodeCamp.Data.TestRepository.<GetAccountAsync>d__6.MoveNext() in TestRepository.cs:line 60\\r\\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\\r\\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\\r\\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\\r\\n at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()\\r\\n 在 CoreCodeCamp.Controllers.TestController.d__4 .MoveNext() in TestController.cs:line 38" TargetSite: {Int32 get_Int32Value()}

這是代碼...

DB2 Camps 表:

Field      Type  Length     
CAMPID     P     5,0    
NAME       A     50
MONIKER    A     20     
EVENTDATE  Z     26
LENGTH     S     3,0
LOCATIONID P     5,0

CampsController.cs:

[HttpGet]
public async Task<ActionResult<CampModel[]>> Get(bool includeTalks = false)
{
  try
  {
    var results = await _repository.GetAllCampsAsync(includeTalks);

    return _mapper.Map<CampModel[]>(results);
  }
  catch (Exception)
  {
    return this.StatusCode(StatusCodes.Status500InternalServerError, "Database Failure");
  }
}

數據庫上下文.cs:

using IBM.EntityFrameworkCore;
using IBM.EntityFrameworkCore.Storage.Internal;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseDb2(_config.GetConnectionString("CodeCamp"),
    p =>
    {
        p.SetServerInfo(IBMDBServerType.AS400, IBMDBServerVersion.AS400_07_01);
        p.UseRowNumberForPaging();
        p.MaxBatchSize(1);
    });

}

Camp.cs 實體:

namespace CoreCodeCamp.Data
{
    public class Camp
    {
        public int CampId { get; set; }
        public string Name { get; set; }
        public string Moniker { get; set; }
        public Location Location { get; set; }
        public DateTime EventDate { get; set; } = DateTime.MinValue;
        public int Length { get; set; } = 1;
        public ICollection<Talk> Talks { get; set; }
    }
}

存儲庫.cs:

public async Task<Camp[]> GetAllCampsAsync(bool includeTalks = false)
{
  _logger.LogInformation($"Getting all Camps");

  IQueryable<Camp> query = _context.Camps;

  return await query.ToArrayAsync();
}

你應該顯示你的代碼...

但是 IBM i .NET 數據提供程序應該有一個用於壓縮數字的 iDB2Decimal 結構。

iDB2Decimal.Value 返回 C# Decimal 類型。

編輯
好的,所以你有兩個壓縮十進制CAMPID P 5,0
並分區十進制LENGTH S 3,0

這應該對應於 iDB2Decimal 和 iDB2Numeric。

兩者都具有返回 C# 十進制的 Value 屬性。

所以我建議將您的模型從int更改為Decimal到這兩個字段。
位置也包含在數據庫中,我不確定您對Location類型做了什么... LOCATIONID P 5,0
public Location Location { get; set; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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