在进行数据读取时,表的主键至关重要,如果我们通过网页新增数据可以利用max函数进行+1解决主键重复问题如果主键并不是INTEGER应该怎么办呢,?
比如工号SA001,SA002,BD001,BD002...
我们在系统制作的时候通常会依据不同科室进行不同子系统的划分,所以工号的开头科室代码应该是一致的,不一致的话我们也可以通过sql语句like再进行匹配,以下代码是科室子系统的查询语句就可以解决上述问题:
#region 生成用户工号
public string? GetMaxNo(DbTransaction dbTrans, out string strErrorMessage)
{
strErrorMessage = string.Empty;
string sqlcmd = string.Empty;
try
{
DbCommand dbCommand;
DataTable dt = new DataTable();
switch (global.DBType)
{
case global.DbType.Oracle:
#region Oracle
OracleClient oracleClient = new OracleClient(dbTrans);
// 查询符合格式的最大工号
sqlcmd = @"
SELECT MAX(SUBSTR(EMP_NO, 2)) AS MAX_ID
FROM SCOTT.ZYHZGLXT_USER
WHERE EMP_NO LIKE 'S_____' AND LENGTH(EMP_NO) = 6";
dbCommand = oracleClient.GetCommand(sqlcmd, dbTrans);
dt = oracleClient.ExecuteDataTable(dbCommand);
break;
#endregion
}
// 获取当前最大工号的数字部分
string maxId = dt.Rows.Count > 0 ? dt.Rows[0]["MAX_ID"].ToString() : "00000";
// 将数字部分转换为整数
int currentNumber = int.Parse(maxId);
// 生成下一个工号
int nextNumber = currentNumber + 1;
string nextId = $"S{nextNumber:D5}"; // D5 表示数字占5位,不足部分补零
return nextId;
}
catch (Exception ex)
{
Log.Error(System.Reflection.MethodBase.GetCurrentMethod()?.DeclaringType?.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod()?.Name, sqlcmd);
strErrorMessage = "生成用户序号出错:" + ex.Message;
return null;
}
}
#endregion
如果有更多方法欢迎评论,如果有错误欢迎指出,本人是新人作者希望得到大家的指导!