一次将数据插入2个相关表中?

Nuv*_*ari 1 sql sql-server sql-insert

我试图使用第一个表中的主键一次插入两个表以插入第二个表,但我不知道如何进行。

我的表结构如下:

PersonId
FirstName
Surname
Run Code Online (Sandbox Code Playgroud)

员工

EmployeeId
HoursWorked
Run Code Online (Sandbox Code Playgroud)

PersonId表中Person是一个自动递增的列。EmployeeId第二个表中的主键和外键应与 相同PersonId

我一直在尝试使用在谷歌上找到的这个查询字符串,但运气不佳:

string queryString = "BEGIN TRANSACTION DECLARE @DataID int; "
 +"INSERT INTO Person(FirstName, Surname) VALUES(@firstName, @surname);" 
 + "SELECT @DataID = scope_identity();" 
 + "INSERT INTO Employee VALUES(@DataId, @hoursWorked);" 
 + "COMMIT";
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 5

在 C# 中,您可以尝试这样的操作:

// define the INSERT query - insert a firstname,surname into "Person",
// and insert a row into the Emplyoee table with the new ID
// created by the first insert
string insertStmt = @"BEGIN TRANSACTION
                      INSERT INTO dbo.Person(FirstName, Surname) VALUES(@FirstName, @Surname);
                      DECLARE @NewPersonId INT = SCOPE_IDENTITY();
                      INSERT INTO dbo.Employee(EmployeeId, HoursWorked) VALUES(@NewPersonId, @HoursWorked);
                      COMMIT TRANSACTION;"

// define connection and command for inserting data                       
using (SqlConnection conn = new SqlConnection(-your-connection-string-here-))
using (SqlCommand cmdInsert = new SqlCommand(insertStmt, conn))
{
    // Define parameters - adapt datatype and max length as required
    cmdInsert.Parameters.Add("@FirstName", SqlDbType.VarChar, 100);
    cmdInsert.Parameters.Add("@Surname", SqlDbType.VarChar, 100);
    cmdInsert.Parameters.Add("@HoursWorked", SqlDbType.Int);
    
    // set parameter values
    cmdInsert.Parameters["@FirstName"].Value = "John";
    cmdInsert.Parameters["@Surname"].Value = "Doe";
    cmdInsert.Parameters["@HoursWorked"].Value = 35;
    
    // Open connection, execute query, close connection
    conn.Open();
    
    int rowsInserted = cmdInsert.ExecuteNonQuery();
    
    conn.Close();
}
Run Code Online (Sandbox Code Playgroud)

更新:正如@charlieface所提到的,如果您只插入一行,您可以更简洁地编写此代码 - 像这样:

// define connection and command for inserting data                       
using (SqlConnection conn = new SqlConnection(-your-connection-string-here-))
using (SqlCommand cmdInsert = new SqlCommand(insertStmt, conn))
{
    // Define and set parameters
    cmdInsert.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = "John";
    cmdInsert.Parameters.Add("@Surname", SqlDbType.VarChar, 100).Value = "Doe";
    cmdInsert.Parameters.Add("@HoursWorked", SqlDbType.Int).Value = 35;
    
    // Open connection, execute query, close connection
    conn.Open();
    int rowsInserted = cmdInsert.ExecuteNonQuery();
    conn.Close();
}
Run Code Online (Sandbox Code Playgroud)