如何从一个表中获取行并将其插入另一个表并获取新的PK值

时间:2012-09-06 19:44:41

标签: sql-server-2008 c#-4.0

我在不同的数据库上有两个相似的表。

Database1/TableA

Database2/TableA

我想从一个表中获取一行并将其插入到其他服务器上的其他表中。像:

Database1/TableA
Id        State            Name
500        OH              John  [Fetch this row]

Database2/TableA
Id        State            Name
1          OH              John  [Insert and fetch PK '1']

我尝试使用批量复制,它工作正常。

但问题是我需要从新插入中获取PK,因为我需要填充另一个子表。

有没有更好的方法来实现这一目标?请关于C#代码,没有数据库链接或SQL查询。只是C#解决方案。或者,如果查询可以在C#代码中使用,那很好。任何使用Dataset或Datarow的工作示例代码都会有很大帮助。

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,您需要从Database.TableA获取行。例如,您可以将SqlDataAdapterDataTableSqlDataReader一起使用。

SCOPE_IDENTITY返回插入同一范围内标识列的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句在同一存储过程,函数或批处理中,则它们在同一范围内。

您可以使用SqlCommand.ExecuteScalar执行insert命令并在一个查询中检索新ID。

const String sqlSelect = "SELECT COL1,COl2,Col3 FROM TableA WHERE COL1=@COL1;"
const String sqlInsert = "INSERT INTO TableA (COl2,Col3)VALUES (@Col2,@Col3);"
                       + "SELECT CAST(scope_identity() AS int)";
using (var con1 = new SqlConnection(db1ConnectionString))
using (var con2 = new SqlConnection(db2ConnectionString))
{
    con1.Open();
    con2.Open();
    using(var selectCommand = new SqlCommand(sqlSelect, con1))
    {
        selectCommand.Parameters.AddWithValue("@COL1", 4711);
        using (var reader = selectCommand.ExecuteReader())
        {
            if (reader.Read())
            {
                int newID;
                using (var insertCommand = new SqlCommand(sqlInsert, con2))
                {
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        insertCommand.Parameters.AddWithValue("@" + reader.GetName(i), reader[i]);
                    }
                    newID = (int)insertCommand.ExecuteScalar();
                }
            }
        }
    }
}