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 的工作示例代码都会有很大帮助。

谢谢!

4

1 回答 1

2

首先,您需要从中获取行Database.TableA。例如,您可以将 aSqlDataAdapter与 aDataTable或 a一起使用SqlDataReader

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

您可以使用SqlCommand.ExecuteScalar执行插入命令并在一次查询中检索新 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();
                }
            }
        }
    }
}
于 2012-09-06T19:53:32.157 回答