通用权限管理系统记录登录日志中的一个问题

8/3/2015来源:C#应用人气:2275

通用权限管理系统记录登录日志中的一个问题

最近,在使用通用权限管理系统开发一个项目,数据库是MSSQL,登录时出现一个错误,发现是记录登录日志时出现的错误。

由于每次登录,都会记录登录日志,就是在记录日志时出现了错误。

先把错误截图

可以看出与记录登录日志的表BaseLoginLog的ID有关系,打开该表

发现该表的ID是nvarchar(50)类型,查询一下该表的数据,截图如下

可看到,ID实际存储的是GUID类型数据,然后我在调试底层代码,找到三个地方:

 1         /// <summary> 2         /// 记录登录日志 3         /// </summary> 4         /// <param name="systemCode">系统编码</param> 5         /// <param name="userId">用户ID</param> 6         /// <param name="userName">登录用户名</param> 7         /// <param name="ipAddress">IP地址</param> 8         /// <param name="macAddress">MAC地址</param> 9         /// <param name="loginStatus">登录结果</param>10         /// <returns></returns>11         public static string AddLog(string systemCode, string userId, string userName, string ipAddress, string macAddress, string loginStatus)12         {13             BaseLoginLogEntity entity = new BaseLoginLogEntity();14             entity.SystemCode = systemCode;15             entity.UserId = userId;16             entity.UserName = userName;17             entity.IPAddress = ipAddress;18             entity.MACAddress = macAddress;19             entity.LoginStatus = loginStatus;20             entity.CreateOn = DateTime.Now;21             string tableName = BaseLoginLogEntity.TableName;22             if (BaseSystemInfo.BusinessDbType == CurrentDbType.Oracle)23             {24                 tableName += DateTime.Now.ToString("yyyyMM");25             }26             BaseLoginLogManager loginLogManager = new BaseLoginLogManager(tableName);27             return loginLogManager.Add(entity, true, false);28         }

 1         /// <summary> 2         /// 添加, 这里可以人工干预,提高程序的性能 3         /// </summary> 4         /// <param name="entity">实体</param> 5         /// <param name="identity">自增量方式,表主键是否采用自增的策略</param> 6         /// <param name="returnId">返回主键,不返回程序允许速度会快,主要是为了主细表批量插入数据优化用的</param> 7         /// <returns>主键</returns> 8         public string Add(BaseLoginLogEntity entity, bool identity = false, bool returnId = false) 9         {10             this.Identity = identity;11             this.ReturnId = returnId;12             return this.AddObject(entity);13         }

 1         /// <summary> 2         /// 添加登录日志  多数据库支持 3         /// </summary> 4         /// <param name="entity">登录日志实体</param> 5         public string AddObject(BaseLoginLogEntity entity) 6         { 7             string key = string.Empty; 8             if (!string.IsNullOrWhiteSpace(entity.Id)) 9             {10                 key = entity.Id.ToString();11             }12             SQLBuilder sqlBuilder = new SQLBuilder(DbHelper, this.Identity, this.ReturnId);13             sqlBuilder.BeginInsert(this.CurrentTableName, this.PRimaryKey);14             if (!this.Identity) 15             {16                 // 这里已经是指定了主键了,所以不需要返回主键了17                 sqlBuilder.ReturnId = false;18                 sqlBuilder.SetValue(this.PrimaryKey, entity.Id);19             }20             else21             {22                 if (!this.ReturnId && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))23                 {24                     if (DbHelper.CurrentDbType == CurrentDbType.Oracle)25                     {26                         sqlBuilder.SetFormula(this.PrimaryKey, "SEQ_" + this.CurrentTableName.ToUpper() + ".NEXTVAL ");27                     }28                     if (DbHelper.CurrentDbType == CurrentDbType.DB2)29                     {30                         sqlBuilder.SetFormula(this.PrimaryKey, "NEXT VALUE FOR SEQ_" + this.CurrentTableName.ToUpper());31                     }32                 }33                 else34                 {35                     if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))36                     {37                         BaseSequenceManager sequenceManager = new BaseSequenceManager(DbHelper);38                         entity.Id = sequenceManager.Increment(this.CurrentTableName);39                         sqlBuilder.SetValue(this.PrimaryKey, entity.Id);40                     }41                 }42             }43             this.SetObject(sqlBuilder, entity);44             sqlBuilder.SetDBNow(BaseLoginLogEntity.FieldCreateOn);45             if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.SqlServer || DbHelper.CurrentDbType == CurrentDbType.access))46             {47                 key = sqlBuilder.EndInsert().ToString();48             }49             else50             {51                 sqlBuilder.EndInsert();52             }53             if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2))54             {55                 return entity.Id.ToString();56             }57             return key;58         }

从代码中可以看出,并没有对ID进行赋值的地方,本来想将底层代码改一下,将生成一个GUID后作为ID值加入进去,后来考虑到这么做不是很好,

考虑到可以直接改一下数据库中的字段类型,将原来的nvarchar(50)类型改为uniqueidentifier类型,并设置了默认值(newid())。

如下图:

再次运行项目,错误不在出现了。

大家在使用通用权限管理系统开发项目中,如果遇到一些问题,可加入“通用权限管理系统”QQ交流群:371168832,一起交流、共同提高。