public async Task UpdateValue(SerialNumberRecord record) { var storeInfo = await StoreInfoHelper.GetHashStoreInfo(_storeInfoResolveService, _hashGroupRepository, _hashGroupName, record.Prefix); if (!storeInfo.TableNames.TryGetValue(HashEntityNames.SerialNumber, out string tableName)) { var fragment = new TextFragment() { Code = TextCodes.NotFoundKeyInHashNodeKeyInfo, DefaultFormatting = "哈希组{0}中的哈希节点关键信息中找不到键值{1}", ReplaceParameters = new List <object>() { _hashGroupName, HashEntityNames.SerialNumber } }; throw new UtilityException((int)Errors.NotFoundKeyInHashNodeKeyInfo, fragment); } await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, false, false, storeInfo.DBConnectionNames.ReadAndWrite, async (conn, transaction) => { SqlTransaction sqlTran = null; if (transaction != null) { sqlTran = (SqlTransaction)transaction; } await using (SqlCommand commond = new SqlCommand() { Connection = (SqlConnection)conn, CommandType = CommandType.Text, Transaction = sqlTran, CommandText = string.Format(@"update {0} set [value]=[value]+1 output inserted.[value] where [id]=@id;", tableName) }) { SqlParameter parameter; parameter = new SqlParameter("@id", SqlDbType.UniqueIdentifier) { Value = record.ID }; commond.Parameters.Add(parameter); await commond.PrepareAsync(); long serialValue = 0; serialValue = (long)await commond.ExecuteScalarAsync(); record.Value = serialValue; } }); }
/// <summary> /// 为序列号记录从DbDataReader中赋值 /// </summary> /// <param name="record"></param> /// <param name="reader"></param> /// <param name="prefix"></param> public static void SetSerialNumberRecordSelectFields(SerialNumberRecord record, DbDataReader reader, string prefix) { record.ID = (Guid)reader[string.Format("{0}id", prefix)]; if (reader[string.Format("{0}prefix", prefix)] != DBNull.Value) { record.Prefix = reader[string.Format("{0}prefix", prefix)].ToString(); } if (reader[string.Format("{0}createtime", prefix)] != DBNull.Value) { record.CreateTime = (DateTime)reader[string.Format("{0}createtime", prefix)]; } if (reader[string.Format("{0}modifytime", prefix)] != DBNull.Value) { record.ModifyTime = (DateTime)reader[string.Format("{0}modifytime", prefix)]; } }
public async Task Add(SerialNumberRecord record) { record.Value = 1; var storeInfo = await StoreInfoHelper.GetHashStoreInfo(_storeInfoResolveService, _hashGroupRepository, _hashGroupName, record.Prefix); if (!storeInfo.TableNames.TryGetValue(HashEntityNames.SerialNumber, out string tableName)) { var fragment = new TextFragment() { Code = TextCodes.NotFoundKeyInHashNodeKeyInfo, DefaultFormatting = "哈希组{0}中的哈希节点关键信息中找不到键值{1}", ReplaceParameters = new List <object>() { _hashGroupName, HashEntityNames.SerialNumber } }; throw new UtilityException((int)Errors.NotFoundKeyInHashNodeKeyInfo, fragment); } await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, false, false, storeInfo.DBConnectionNames.ReadAndWrite, async (conn, transaction) => { SqlTransaction sqlTran = null; if (transaction != null) { sqlTran = (SqlTransaction)transaction; } await using (SqlCommand commond = new SqlCommand() { Connection = (SqlConnection)conn, CommandType = CommandType.Text, Transaction = sqlTran }) { if (record.ID == Guid.Empty) { commond.CommandText = string.Format(@"insert into {0}([id],[prefix],[value],[createtime],[modifytime]) values(default,@prefix,1,getutcdate(),getutcdate()); select @newid=[id] from {0} where [sequence]=SCOPE_IDENTITY()", tableName); } else { commond.CommandText = string.Format(@"insert into {0}([id],[prefix],[value],[createtime],[modifytime]) values(@id,@prefix,1,getutcdate(),getutcdate())", tableName); } SqlParameter parameter; if (record.ID != Guid.Empty) { parameter = new SqlParameter("@id", SqlDbType.UniqueIdentifier) { Value = record.ID }; commond.Parameters.Add(parameter); } else { parameter = new SqlParameter("@newid", SqlDbType.UniqueIdentifier) { Direction = ParameterDirection.Output }; commond.Parameters.Add(parameter); } parameter = new SqlParameter("@prefix", SqlDbType.NVarChar, 1000) { Value = record.Prefix }; commond.Parameters.Add(parameter); await commond.PrepareAsync(); try { await commond.ExecuteNonQueryAsync(); } catch (SqlException ex) { if (ex.Number == 2601) { var fragment = new TextFragment() { Code = TextCodes.ExistFoundSerialNumberRecordByPrefix, DefaultFormatting = "前缀为{0}的序列号记录已经存在", ReplaceParameters = new List <object>() { record.Prefix } }; throw new UtilityException((int)Errors.ExistFoundSerialNumberRecordByPrefix, fragment); } else { throw; } } if (record.ID == Guid.Empty) { record.ID = (Guid)commond.Parameters["@newid"].Value; } } }); }
public async Task <SerialNumberRecord> QueryByPrefix(string prefix) { SerialNumberRecord record = null; var storeInfo = await StoreInfoHelper.GetHashStoreInfo(_storeInfoResolveService, _hashGroupRepository, _hashGroupName, prefix); if (!storeInfo.TableNames.TryGetValue(HashEntityNames.SerialNumber, out string tableName)) { var fragment = new TextFragment() { Code = TextCodes.NotFoundKeyInHashNodeKeyInfo, DefaultFormatting = "哈希组{0}中的哈希节点关键信息中找不到键值{1}", ReplaceParameters = new List <object>() { _hashGroupName, HashEntityNames.SerialNumber } }; throw new UtilityException((int)Errors.NotFoundKeyInHashNodeKeyInfo, fragment); } await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, true, false, storeInfo.DBConnectionNames.Read, async (conn, transaction) => { SqlTransaction sqlTran = null; if (transaction != null) { sqlTran = (SqlTransaction)transaction; } await using (SqlCommand commond = new SqlCommand() { Connection = (SqlConnection)conn, CommandType = CommandType.Text, Transaction = sqlTran, CommandText = string.Format(@"select {0} from {1} where [prefix]=@prefix", StoreHelper.GetSerialNumberRecordSelectFields(string.Empty), tableName) }) { var parameter = new SqlParameter("@prefix", SqlDbType.NVarChar, 1000) { Value = prefix }; commond.Parameters.Add(parameter); await commond.PrepareAsync(); SqlDataReader reader = null; await using (reader = await commond.ExecuteReaderAsync()) { if (await reader.ReadAsync()) { record = new SerialNumberRecord(); StoreHelper.SetSerialNumberRecordSelectFields(record, reader, string.Empty); } await reader.CloseAsync(); } } }); return(record); }