使用 SQL 和 C# 将表 1 的主键分配为表 2 中的外键

本文关键字:分配 SQL 将表 使用 | 更新日期: 2023-09-27 18:31:08

我有使用自动增量主键、Member_Id和Office_Id的表成员和办公室。我正在将数据插入到表中,但希望将成员表的主键作为外键插入到办公室表上,以便将成员分配给办公室记录。 请协助。 下面是我插入记录的代码片段,但我只是不知道如何链接两个表。

protected void capture()
    {
        string CS = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(CS))
        {
            conn.Open();
            SqlCommand com = new SqlCommand();
            SqlParameter myParam = new SqlParameter();
            com.CommandText = "INSERT into Member(Appointment_Number, Initials, Surname, Designation) VALUES (@Appointment_Number, @Initials, @Surname, @Designation)";
            com.Parameters.AddWithValue("@Appointment_Number", txtAppointmentNumber.Text);
            com.Parameters.AddWithValue("@Initials", txtInitials.Text);
            com.Parameters.AddWithValue("@Surname", txtSurname.Text);
            com.Parameters.AddWithValue("@Designation", ddlDesignation.Text);              
            com.Connection = conn;
            com.ExecuteNonQuery();
            com.Parameters.Clear();
           //Insert records into the office table                
            com.CommandText = "INSERT into Offices(Office_Number, Status, Building, Branch, Floor) VALUES (@Office_Number, @Status, @Building, @Branch, @Floor)";
            com.Parameters.AddWithValue("@Office_Number", txtOffNo.Text);
            com.Parameters.AddWithValue("@Status", ddlOStatus.Text);
            com.Parameters.AddWithValue("@Building", ddlBuilding.Text);
            com.Parameters.AddWithValue("@Branch", ddlBranch.Text);
            com.Parameters.AddWithValue("@Floor", ddlFloors.Text);               
            com.Connection = conn;
            com.ExecuteNonQuery();
            com.Parameters.Clear();               
            if (IsPostBack)
            {
                Response.Redirect("~/Pages/MemberDetails.aspx");
            }
        }        
    }

使用 SQL 和 C# 将表 1 的主键分配为表 2 中的外键

我认为,您想在办公室和成员 1 到 n 之间设置关系。

为此,让我们在成员表中添加 officeid 字段,在成员之前插入办公室记录并像这样更改代码;

protected void capture()
    {
        string CS = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(CS))
        {
            conn.Open();
            SqlCommand com = new SqlCommand();
            SqlParameter myParam = new SqlParameter();
            //Insert records into the office table                
            com.CommandText = "INSERT into Offices(Office_Number, Status, Building, Branch, Floor) VALUES (@Office_Number, @Status, @Building, @Branch, @Floor)";
            com.Parameters.AddWithValue("@Office_Number", txtOffNo.Text);
            com.Parameters.AddWithValue("@Status", ddlOStatus.Text);
            com.Parameters.AddWithValue("@Building", ddlBuilding.Text);
            com.Parameters.AddWithValue("@Branch", ddlBranch.Text);
            com.Parameters.AddWithValue("@Floor", ddlFloors.Text);
            com.Connection = conn;
            com.ExecuteNonQuery();
            com.Parameters.Clear();
            com.CommandText = "select max(Office_Id) from Offices";
            int officeid = Convert.ToInt32(com.ExecuteScalar());
            com.CommandText = "INSERT into Member(officeid,Appointment_Number, Initials, Surname, Designation) VALUES (@officeid,@Appointment_Number, @Initials, @Surname, @Designation)";
            com.Parameters.AddWithValue("@officeid", officeid);
            com.Parameters.AddWithValue("@Appointment_Number", txtAppointmentNumber.Text);
            com.Parameters.AddWithValue("@Initials", txtInitials.Text);
            com.Parameters.AddWithValue("@Surname", txtSurname.Text);
            com.Parameters.AddWithValue("@Designation", ddlDesignation.Text);
            com.Connection = conn;
            com.ExecuteNonQuery();
            com.Parameters.Clear();
            if (IsPostBack)
            {
                Response.Redirect("~/Pages/MemberDetails.aspx");
            }
        }        
    }

使用相同的连接插入到第一个表中后,SELECT SCOPE_IDENTITY()获取刚刚创建的自动分配的标识值。然后,您可以使用它插入到第二个表中。

使用 SCOPE_IDENTITY() 将确保您始终获得刚刚创建的 ID。如果您的系统由多个用户同时使用,则您不希望冒险获取恰好与您同时插入数据的其他用户创建的标识值。

例如,在第一次插入后:

com.CommandText = "SELECT SCOPE_IDENTITY()";
int my_id_just_created = Convert.ToInt32(com.ExecuteScalar());
最简单的

方法可能是先插入Office表,获取作用域标识,然后将其放入member插入的FK中。要获取范围标识,只需使用以下语法:

INSERT INTO YourTable
(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();

然后,使用com.ExecuteScalar(),它将返回一个 Int,其中包含Office表的 PK,您可以将其用作Member表的 FK。