我在不同的数据库上有两个相似的表。
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的工作示例代码都会有很大帮助。
谢谢!
答案 0 :(得分:2)
首先,您需要从Database.TableA
获取行。例如,您可以将SqlDataAdapter
与DataTable
或SqlDataReader
一起使用。
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();
}
}
}
}
}