我有一个叫emp
的表。该表包含三列empid
,ename
和salary
。我必须将empid
存储为自动生成的ID,例如:E001,E002,E003。我怎么能用C#做到这一点?
答案 0 :(得分:2)
如果此不是作业:
考虑一下此ID命名方案对您的数据的限制。
如果这些限制是不可接受的,请寻找更好的机制来生成唯一ID。首先,是否真的有必要将字母E
与数字一起存储,或者您只需将empid
列为INT
类型的列,然后以编程方式添加E
?如果您从未在任何地方实际显示ID,请考虑使用例如GUID(请参阅.NET类型System.Guid
的文档),因为它们保证是唯一的(出于大多数实际目的)。或者只需在empid
列上使用数据库的自动增量功能。
如果此是作业:
可以回收(重复使用)已删除记录的ID以及稍后添加的记录吗?
尝试在.NET框架中找到一个方法,该方法使用任意数量的前导零来格式化整数;例如1
→"001"
。
还要尝试在.NET框架中找到相反的方法,例如: "001"
→1
。
使用这两个函数可以在Ennn
ID及其数字部分之间进行转换。
从数据库表中检索所有现有ID:
如果您无法回收ID,请按降序获取它们,告诉DB仅返回该排序结果集中的第一个条目,并从返回的ID值中确定下一个较大的ID。
如果你可以回收ID,最好按升序获得它们并找到第一个间隙(即当两个相邻ID的数字部分之间的差异大于1时)。建立一个新的ID,使其落入这个空白。
将整数格式化为E...
字符串:
int numericPart = 123; // <-- example input
string empid = numericPart.ToString("'E'000");
从E...
字符串中提取数字部分
(使用正则表达式,在你的情况下实际上是矫枉过正的):
using System.Text.RegularExpressions;
...
string empid = "E123"; // <-- example input
var empidPattern = new Regex(@"^E(?<NumericPart>\d{3})$");
if (empidPattern.IsMatch(empid))
{
// extract numeric part from key and convert it to int:
int numericPart = Int32.Parse(
empidPattern.Match(empid).Groups["NumericPart"].Value);
}
else
{
// 'empid' does not represent a valid key (wrong format)
}
将现有密钥从数据库表加载到集合中:
using System.Data;
// create a new collection that will hold all empid keys in emp
var empidList = new List<string>();
// open a database connection -- you need to add appropriate code here:
using (IDbConnection db = ...)
{
// define the query for retrieving all empid keys:
IDbCommand getEmpidList = db.CreateCommand();
getEmpidList.CommandType = CommandType.Text;
getEmpidList.CommandText = "SELECT empid FROM emp ORDER BY empid ASC";
// execute the query and transfer its result set to the collection:
using (IDataReader reader = getEmpidList.ExecuteReader())
{
while (reader.Read())
{
empidList.Add(reader.GetString(0));
}
}
}
我将把这些部分放在一起,添加上面描述的实际逻辑,并进一步改进代码。
答案 1 :(得分:1)
您可以使用autoincremented int列并添加“E”前缀仅用于显示目的。
答案 2 :(得分:1)
public string GetLatestOrderId()
{
string ReceivedId = string.Empty;
string displayString = string.Empty;
String query = "SELECT MAX(OrderReceivedNo) FROM [Order_Received]";
String data = DataManager.RunExecuteScalar(ConnectionString.Constr, query);
ReceivedId = data;
if (string.IsNullOrEmpty(ReceivedId))
{
ReceivedId = "OR0000";//It is the start index of alpha numeric value
}
int len = ReceivedId.Length;
string splitNo = ReceivedId.Substring(2, len - 2);//This line will ignore the string values and read only the numeric values
int num = Convert.ToInt32(splitNo);
num++;// Increment the numeric value
displayString = ReceivedId.Substring(0, 2) + num.ToString("0000");//Concatenate the string value and the numeric value after the increment
return displayString;
}
答案 3 :(得分:0)
这是我的回答,
public string GetLatestOrderId()
{
string ReceivedId = string.Empty;
string displayString = string.Empty;
String query = "SELECT MAX(OrderReceivedNo) FROM [Order_Received]";
String data = DataManager.RunExecuteScalar(ConnectionString.Constr, query);
ReceivedId = data;
if (string.IsNullOrEmpty(ReceivedId))
{
ReceivedId = "OR0000";//It is the start index of alpha numeric value
}
int len = ReceivedId.Length;
string splitNo = ReceivedId.Substring(2, len - 2);//This line will ignore the string values and read only the numeric values
int num = Convert.ToInt32(splitNo);
num++;// Increment the numeric value
displayString = ReceivedId.Substring(0, 2) + num.ToString("0000");//Concatenate the string value and the numeric value after the increment
return displayString;
}
答案 4 :(得分:0)
Sql DataAdapter sda = new SqlDataAdapter("select * from emp", con);
Dataset ds = new DataSet();
sda.Fill(ds, "emp_id");
string EmpId;
//this condition checks that table is empty
// or not if table is empty that bill id is E0001 other wise else par is run
if (ds.Tables[0].Rows.Count == 0)
{
EmpId = "E0001";
}
else
{
string s = ds.Tables[0].Rows[ds.Tables[0].Rows.Count - 1]["emp_id"].ToString();
//retriving empid column last cell data.
int len = s.Length;
string splitno = s.Substring(3, len - 3); //spliting string
int num = Convert.ToInt32(splitno); //converting splited string in integer
num++; //increasing splited string by 1
EmpId = s.Substring(0, 3) + num.ToString("0000"); //adding String and store in empid string
}