-1

我正在尝试设计一种方法,允许我使用 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);
}
4

2 回答 2

4

我建议您使用 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);
于 2012-11-20T13:39:05.997 回答
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);
}      
于 2014-11-26T10:44:11.310 回答