最近,在使用通用權(quán)限管理系統(tǒng)開(kāi)發(fā)一個(gè)項(xiàng)目,數(shù)據(jù)庫(kù)是MSSQL,登錄時(shí)出現(xiàn)一個(gè)錯(cuò)誤,發(fā)現(xiàn)是記錄登錄日志時(shí)出現(xiàn)的錯(cuò)誤。
由于每次登錄,都會(huì)記錄登錄日志,就是在記錄日志時(shí)出現(xiàn)了錯(cuò)誤。
先把錯(cuò)誤截圖
可以看出與記錄登錄日志的表BaseLoginLog的ID有關(guān)系,打開(kāi)該表
發(fā)現(xiàn)該表的ID是nvarchar(50)類型,查詢一下該表的數(shù)據(jù),截圖如下
可看到,ID實(shí)際存儲(chǔ)的是GUID類型數(shù)據(jù),然后我在調(diào)試底層代碼,找到三個(gè)地方:
1 /// <summary> 2 /// 記錄登錄日志 3 /// </summary> 4 /// <param name="systemCode">系統(tǒng)編碼</param> 5 /// <param name="userId">用戶ID</param> 6 /// <param name="userName">登錄用戶名</param> 7 /// <param name="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 /// 添加, 這里可以人工干預(yù),提高程序的性能 3 /// </summary> 4 /// <param name="entity">實(shí)體</param> 5 /// <param name="identity">自增量方式,表主鍵是否采用自增的策略</param> 6 /// <param name="returnId">返回主鍵,不返回程序允許速度會(huì)快,主要是為了主細(xì)表批量插入數(shù)據(jù)優(yōu)化用的</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 /// 添加登錄日志 多數(shù)據(jù)庫(kù)支持 3 /// </summary> 4 /// <param name="entity">登錄日志實(shí)體</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 // 這里已經(jīng)是指定了主鍵了,所以不需要返回主鍵了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 }
從代碼中可以看出,并沒(méi)有對(duì)ID進(jìn)行賦值的地方,本來(lái)想將底層代碼改一下,將生成一個(gè)GUID后作為ID值加入進(jìn)去,后來(lái)考慮到這么做不是很好,
考慮到可以直接改一下數(shù)據(jù)庫(kù)中的字段類型,將原來(lái)的nvarchar(50)類型改為uniqueidentifier類型,并設(shè)置了默認(rèn)值(newid())。
如下圖:
再次運(yùn)行項(xiàng)目,錯(cuò)誤不在出現(xiàn)了。
大家在使用通用權(quán)限管理系統(tǒng)開(kāi)發(fā)項(xiàng)目中,如果遇到一些問(wèn)題,可加入“通用權(quán)限管理系統(tǒng)”QQ交流群:371168832,一起交流、共同提高。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注