Additional information: 对象不能从 DBNull 转换为其他类型。

空白里的亮点 2018-01-03 01:56:59

public static T DataRowToT<T>(DataRow source) where T : class,new()
{
T item = null;
if (source == null)
{
return item;
}
item = new T();
Type targettype = typeof(T);
Type ptype = null;
Object value = null;
foreach (PropertyInfo pi in targettype.GetProperties())
{
if (pi.CanWrite && source.Table.Columns.Contains(pi.Name))
{
ptype = Type.GetType(pi.PropertyType.FullName);
if (!(pi.PropertyType.FullName == "System.Byte[]" && source[pi.Name] == System.DBNull.Value))
{
value = Convert.ChangeType(source[pi.Name], ptype);
pi.SetValue(item, value, null);

}

}
}
return item;
}
...全文
243 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不管类型是 string 还是 byte[ ],都是一样,要对于可能为空的返回数据首先判断 DBNull。 另外,尽量不要写反射代码。
  • 打赏
  • 举报
回复
var cmd = dbconn.CreateCommand();
cmd.CommandText = $"select Id, UserName,UserCode,UserNumber from User";
using (var reader = cmd.ExecuteReader())
{
    var lst = (from IDataRecord x in reader
                select new MyDataType
                {
                    Id = (string)x[0],
                    Name = (string)x[1],
                    ShenFenZheng = x[2] == DBNull.Value ? null : (string)x[2],
                    Number = x[3] == DBNull.Value ? 0 : (int)x[3]
                }).ToList();
    proc(lst);
}
  • 打赏
  • 举报
回复
从 ADO.NET 查询出来的 DataReader[....] 是弱类型的(object 的),它的值可能是 DBNull。所以对于这类数据就不能随便简单地转换。例如:
var cmd = dbconn.CreateCommand();
cmd.CommandText = $"select Id, UserName,UserCode from UscUser";
using (var reader = cmd.ExecuteReader())
{
    var lst = (from IDataRecord x in reader
                select new MyDataType
                {
                    Id = (string)x[0],
                    Name = (string)x[1],
                    ShenFenZheng = (string)x[2],
                    Number = x[3] == DBNull.Value ? 0 : (int)x[3]
                }).ToList();
    proc(lst);
}
这里,对于不可能为空的字段就不处理了,但是对于可能为空的字段(Number)就需要判断是否为空,为空就应该进行特殊处理。
  • 打赏
  • 举报
回复
判断条件里&&改为||
内容概要:本文系统研究了基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性问题,结合机械臂正向与逆向运动学建模、蒙特卡洛法分析工作空间、笛卡尔空间内的圆弧轨迹生成等关键技术,利用Matlab实现了双臂系统的协同控制与轨迹跟踪仿真。重点探讨了雅可比矩阵伪逆法在解决冗余自由度机械臂逆运动学问题中的应用,深入分析了轨迹跟踪过程中误差的收敛特性,并通过仿真实验验证了该方法在复杂任务场景下的有效性、稳定性与鲁棒性,为多臂机器人在工业自动化、精密操作等领域的协同作业提供了理论依据与技术支持。; 适合人群:具备机器人学、自动控制理论基础及Matlab编程能力的科研人员与工程技术人员,特别适合从事机械臂控制、轨迹规划、多机器人协同等方向的硕士、博士研究生及相关领域研究人员。; 使用场景及目标:①掌握基于雅可比伪逆法的机械臂逆运动学求解原理与实现方法;②理解双臂系统在笛卡尔空间中协同轨迹规划的机制;③分析并优化轨迹跟踪过程中的误差收敛性能;④为多机器人系统在复杂动态环境下的高精度协同控制提供算法设计与仿真验证支持。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,按照文档目录循序渐进地学习,重点关注算法实现细节、仿真参数设置与结果分析部分,同时可进一步探索将智能优化算法或深度学习方法引入轨迹规划与误差补偿的研究方向。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧