我想根据从下拉列表中选择的部门创建一个ID生成器。可以说我的ddl有3个部门(A,B,C),生成ID时将是A20181001,然后是提交时的A20181002,但是当我将A20181001发送到数据库后从ddl中选择B时,它将是B20181001。>
到目前为止,我已经为没有部门的id创建了增量代码。这是我到目前为止所做的代码。 (我使用今天的日期,所以20181001只是一个例子):
void getMRF_No()
{
string year = DateTime.Now.Date.ToString("yyyyMMdd");
int mrf = 0;
int i;
string a;
//string x = Request.QueryString["BUnit"];
string mrfNo = "";
database db = new database();
string conn = dbe.BU();
SqlConnection connUser = new SqlConnection(conn);
SqlCommand cmd = connUser.CreateCommand();
SqlDataReader sdr = null;
string query = "SELECT TOP 1 MRF_NO FROM incMRF ORDER BY MRF_NO DESC";
connUser.Open();
cmd.CommandText = query;
sdr = cmd.ExecuteReader();
while (sdr.Read())
{
mrfNo = sdr.GetInt32(0).ToString();
}
if (mrfNo == "")
{
mrfNo = Convert.ToString(year) + "" + 00;
}
mrf += 0;
i = Convert.ToInt32(mrfNo) + 1;
a = i.ToString();
txtMRFNo.Text = a;
connUser.Close();
}
任何改进此代码的帮助都将有所帮助。谢谢:)
编辑: 这是下拉列表代码:
void SelectBU()
{
string database = dbe.BU ();
using (SqlConnection con = new SqlConnection(database))
{
con.Open();
string query = "select BUnit from BusinessUnit";
using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
{
DataSet ds = new DataSet();
sda.Fill(ds, "BUnit");
ddlBu.DataSource = ds;
ddlBu.DataTextField = "BUnit";
ddlBu.DataValueField = "BUnit";
ddlBu.DataBind();
selectOption(ddlBu, "Select Dept");
}
con.Close();
}
}
EDIT2:如果某些人不知道或不了解,我将在这里说明我正在搜索什么。我想要的是从下拉列表中选择一个部门,例如我选择了A。文本框显示为A2018102201。如果我选择B,它应该显示B2018102201,如果它是C,则显示c2018102201。一旦我将其提交到数据库并加载新表格,它将更改其编号。因此,如果数据库中已经存在A2018102201,则文本框中显示的文本将为A2018102202。但是,如果我选择B,则文本框将显示B2018102201,因为它在数据库中尚不存在。
答案 0 :(得分:-1)
首先,您应该获得最大ID ,然后增加ID的数字部分,如果这是一个多用户应用程序,则必须lock
表,因为它可能创建许多ID duplication
,因此不建议在c#上创建这样的ID,最好在SQL Server上创建Sequence
。但是我为您编写了此示例,只需用适当的值调用它即可。
static string getMRF_No(string prefixCharFromDropDownList)
{
string year = DateTime.Now.Date.ToString("yyyyMMdd");
string mrfNo = "";
SqlConnection connUser = new SqlConnection("Server=130.185.76.162;Database=StackOverflow;UID=sa;PWD=$1@mssqlICW;connect timeout=10000");
SqlCommand cmd = new SqlCommand(
$"SELECT MAX(MRF_NO) as MaxID FROM incMRF where MRF_NO like '{prefixCharFromDropDownList}%'"
,connUser
);
connUser.Open();
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
mrfNo = sdr["MaxID"].ToString();
}
if (mrfNo == "")
{
mrfNo = prefixCharFromDropDownList + year + "000";
}
else
{
mrfNo = prefixCharFromDropDownList + (long.Parse(mrfNo.Substring(1)) + 1).ToString().PadLeft(2);
}
sdr.Close();
cmd = new SqlCommand($"INSERT INTO incMRF (MRF_NO) values ('{mrfNo}')",connUser);
cmd.ExecuteNonQuery();
connUser.Close();
//txtMRFNo.Text = prefixCharFromDropDownList + i.ToString();
return mrfNo;
}
我在控制台应用程序上将此方法称为测试。
static void Main(string[] args)
{
// send dropdown (selected char) as prefix to method
var newAId = getMRF_No("A");
var newAnotherAId = getMRF_No("A");
var newBId = getMRF_No("B");
var newAnotherAId2 = getMRF_No("A");
Console.ReadKey();
}