通过C#将一个数据库表中的行复制到另一个服务器上的两个数据库中

时间:2012-11-20 13:32:23

标签: c# .net database tsql visual-studio-2012

我正在尝试设计一种方法,允许我使用SELECT从SQL数据库中获取一行。然后,我想将返回的行插入到驻留在不同服务器上的数据库上的相同表中。

我的服务器连接和SELECT语句都有效;我可以在控制台窗口中查看我想要复制的行。

我遇到的问题是弄清楚我需要在C#中使用什么数据结构,如何用SELECT填充这个数据结构,最后如何使用该数据结构来插入行。

我想保持打开多行的选项,但是现在如果我可以让一行传输它就太棒了。

谢谢。

编辑:经过一系列的研究,我自己已经完成了这项工作。我已将下面的代码包含在heop中,它可以帮助其他人,但是虽然它有效,但它远非理想。我是业余爱好者,尚未完成。

static public void CopyDatabaseRows(string ConnectionStringDEV, string ConnectionStringLOCAL, string queryString)
{
    //Connect to first database table to retreive row/rows and populate dataset + datatable.
    DataSet dataSet = new DataSet();
    SqlConnection conn = new SqlConnection(ConnectionStringDEV);
    conn.Open();

    SqlCommand command = new SqlCommand(queryString, conn);
    DataTable dataTable = new DataTable();
    SqlDataAdapter dataAdapter = new SqlDataAdapter(queryString, conn);

    dataAdapter.FillSchema(dataSet, SchemaType.Mapped);
    dataAdapter.Fill(dataSet, "dbo.FileRegister");
    dataTable = dataSet.Tables["dbo.FileRegister"];
    conn.Close();

    //Connect to second Database and Insert row/rows.
    SqlConnection conn2 = new SqlConnection(ConnectionStringLOCAL);
    conn2.Open();

    SqlBulkCopy bulkCopy = new SqlBulkCopy(conn2);
    bulkCopy.DestinationTableName = "dbo.FileRegister";
    bulkCopy.WriteToServer(dataTable);
}

2 个答案:

答案 0 :(得分:3)

我建议您使用Simple.Data(https://github.com/markrendle/Simple.Data)之类的东西来轻松完成这项工作。因为它使用C#动态,你可以加载动态类型,并将其直接插入第二个Simple.Data连接,而不必担心类型转换。

类似的东西:

var db = Database.OpenConnection("data source=.;initial catalog=Xyz;etc");

var db2 = Database.OpenConnection("data source=somewhereElse;initial catalog=Xyz;etc");

dynamic user = db.Users.FindById(1);

db2.Users.Insert(user);

答案 1 :(得分:0)

完美无缺......我修改了这段代码......用它......

string local = "Server=destinationservername;Database=destinationserverdb;Uid=sa;Pwd=<Password>;

string dev = "Server=sourceservername;Database=sourceserverdb;Uid=sa;Pwd=Password;    


private void btncopy_Click(object sender, EventArgs e)

{            
    CopyDatabaseRows(dev, local, query);            
}

static public void CopyDatabaseRows(string ConnectionStringDEV, string ConnectionStringLOCAL, string queryString)
{
    //Connect to first database table to retreive row/rows and populate dataset + datatable.
    DataSet dataSet = new DataSet();
    SqlConnection conn = new SqlConnection(ConnectionStringDEV);
    conn.Open();

    SqlCommand command = new SqlCommand(queryString, conn);
    DataTable dataTable = new DataTable();
    SqlDataAdapter dataAdapter = new SqlDataAdapter(queryString, conn);

    dataAdapter.FillSchema(dataSet, SchemaType.Mapped);
    dataAdapter.Fill(dataSet, "dbo.DeviceLogs");
    dataTable = dataSet.Tables["dbo.DeviceLogs"];
    conn.Close();

    //Connect to second Database and Insert row/rows.
    SqlConnection conn2 = new SqlConnection(ConnectionStringLOCAL);
    conn2.Open();

    SqlBulkCopy bulkCopy = new SqlBulkCopy(conn2);
    bulkCopy.DestinationTableName = "dbo.DeviceLogs";
    bulkCopy.WriteToServer(dataTable);

    MessageBox.Show(dataTable.Rows.Count.ToString() + "  rows copied successfully", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}