如何根据选定的下拉列表创建要在文本框中显示的ID

时间:2018-10-21 11:01:06

标签: c# sql-server

我想根据从下拉列表中选择的部门创建一个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,因为它在数据库中尚不存在。

1 个答案:

答案 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();
}