我要在插入后得到返回id。字段在oracle中为RAW(16),在C#中为Guid
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
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();
}
}
}
执行代码如下:
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时,
var id = param.Get<Guid>("Id");
我得到了一个错误异常:“System.InvalidCastException”在Dapper.dll中param.Get<>没有调用RawGuidHandler,它只是执行一个
return (T)val;
如何解决这个问题?
发布于 2022-07-28 01:54:04
我从源代码中做了一些修改,然后就成功了。
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;
}
https://stackoverflow.com/questions/73141259
复制相似问题