• 一个Dotnet数据框架的bug


    好久没写C#代码了,今天在维护公司老项目时,偶然发现一个BUG。记录一下,后面的同学就不要踩坑啦。

    -------------------------------------------------------------------

    该项目采用了一个国产的数据访问框架 PDF.NET ,但是我有一个表的主键是bigint,数据编号已经大于Int32.MaxValue,此时就不能再插入数据了。原因如下(红色部分转换报错):

    internal static int InsertInner(EntityBase entity, List<string> objFields, CommonDB DB)
            {
                if (objFields == null || objFields.Count == 0)
                    return 0;
    
                IDataParameter[] paras = new IDataParameter[objFields.Count];
    
                string tableName = entity.TableName;
                string identityName = entity.IdentityName;
                string sql = "INSERT INTO " + entity.GetSchemeTableName();
                string fields = "";
                string values = "";
                int index = 0;
    
                //获取实体属性信息缓存
                var entityFieldsCache = EntityFieldsCache.Item(entity.GetType());
    
                foreach (string field in objFields)
                {
                    if (identityName != field)
                    {
                        fields += ",[" + field + "]";
                        string paraName = DB.GetParameterChar + "P" + index.ToString();
                        values += "," + paraName;
                        paras[index] = DB.GetParameter(paraName, entity.PropertyList(field));
    
                        //从缓存中获取当前field所对应的类型
                        Type fieldType = entityFieldsCache.GetPropertyType(field);
    
                        if (fieldType == typeof(string) && paras[index].Value != null)
                            //为字符串类型的参数指定长度 edit at 2012.4.23
                            //((IDbDataParameter)paras[index]).Size = entity.GetStringFieldSize(field);
                             SetParameterSize(ref paras[index], entity, field,DB);
                        else if (fieldType == typeof(byte[]))
                            //为字节类型指定转换类型,防止空值时被当作字符串类型
                            paras[index].DbType = DbType.Binary;
    
                        index++;
                    }
                }
                sql = sql + "(" + fields.TrimStart(',') + ") VALUES (" + values.TrimStart(',') + ")";
    
                int count = 0;
    
                if (identityName != "")
                {
                    //有自增字段
                    object id = entity.PropertyList(identityName);
    
                    EntityCommand ec = new EntityCommand(entity, DB);
                    string insertKey = ec.GetInsertKey();
    
                    count = DB.ExecuteInsertQuery(sql, CommandType.Text, paras, ref id,insertKey);
                    entity.setProperty(identityName, Convert.ToInt32(id));
                }
                else
                {
                    count = DB.ExecuteNonQuery(sql, CommandType.Text, paras);
                }
                if (count > 0)
                    entity.ResetChanges();
    
                return count;
    
            }

    该bug已经给作者说了,期待他们的及时修复。

  • 相关阅读:
    Windows Service开发介绍
    解决Vuex持久化插件-在F5刷新页面后数据不见的问题
    selenium+python 安装使用
    字符串拆分姓名、电话、省市区逻辑
    常用正则表达式大全——包括校验数字、字符、特殊密码过滤
    uni-app 地图初用 map
    前端常见手写笔试题
    数组去重和排序
    js获取当前时间年份,处理年月日
    js循环匹配组合成新对象或js循环组合新数据
  • 原文地址:https://www.cnblogs.com/tonymu/p/6830952.html
Copyright © 2020-2023  润新知