首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dapper,如何读取甲骨文回放id

dapper,如何读取甲骨文回放id
EN

Stack Overflow用户
提问于 2022-07-27 16:05:49
回答 1查看 61关注 0票数 0

我要在插入后得到返回id。字段在oracle中为RAW(16),在C#中为Guid

代码语言:javascript
运行
复制
    public class Test
    {
        public Guid Id { get; set; }

        public Guid? PlanId { get; set; }

        public bool State { get; set; }

        public DateTime CreateTime { get; set; }
    }

我创建了一个RawGuidHandler,继承自SqlMapper.TypeHandler

代码语言:javascript
运行
复制
    internal class RawGuidHandler : SqlMapper.TypeHandler<Guid>
    {
        public override Guid Parse(object value)
        {
            if (value is byte[] byteArray)
            {
                return new Guid(byteArray);
            }

            throw new NotImplementedException("RawGuidHandler->Parse");
        }

        public override void SetValue(IDbDataParameter parameter, Guid value)
        {
            if (value != Guid.Empty)
            {
                parameter.Value = value.ToByteArray();
            }
        }
    }

执行代码如下:

代码语言:javascript
运行
复制
            var conn = new OracleConnection(connBuilder.ToString());

            var t = new Test
            {
                PlanId = Guid.NewGuid(),
                State = true
            };

            var sql = "INSERT INTO \"tb_Test\" ( \"PlanId\", \"State\") VALUES ( :PlanId, :State) returning \"Id\" into :Id";

            var param = new DynamicParameters();
            param.Add(":PlanId", t.PlanId);
            param.Add(":State", t.State);

            param.Add(":Id", dbType: DbType.Binary, direction: ParameterDirection.Output, size:16);

                conn.Execute(sql, param: param);
                var id = param.Get<Guid>("Id");

成功执行sql。但是,当读到param的id时,

代码语言:javascript
运行
复制
 var id = param.Get<Guid>("Id");

我得到了一个错误异常:“System.InvalidCastException”在Dapper.dll中param.Get<>没有调用RawGuidHandler,它只是执行一个

代码语言:javascript
运行
复制
return (T)val;

如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2022-07-28 01:54:04

我从源代码中做了一些修改,然后就成功了。

代码语言:javascript
运行
复制
        public T Get<T>(string name)
        {
            var paramInfo = parameters[Clean(name)];
            var attachedParam = paramInfo.AttachedParam;
            object val = attachedParam == null ? paramInfo.Value : attachedParam.Value;
            if (val == DBNull.Value)
            {
                if (default(T) != null)
                {
                    throw new ApplicationException("Attempting to cast a DBNull to a non nullable type! Note that out/return parameters will not have updated values until the data stream completes (after the 'foreach' for Query(..., buffered: false), or after the GridReader has been disposed for QueryMultiple)");
                }
                return default;
            }
#pragma warning disable 618
            SqlMapper.LookupDbType(typeof(T), name, true, out var handler);
#pragma warning disable 618

            if (handler != null)
            {
                return (T)handler.Parse(typeof(T), val);
            }

            return (T)val;
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73141259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档