2014-10-17 79 views
2

得到了一个SQL语句在C#中运行,这从表中数据库MySQL中的获取数据,并将其插入到在数据库B表。我如何从一个数据库导入数据到另一个

我正在执行选择并插入到一条SQL语句中,因为数据太多而无法保存在内存中。我的问题是,我将如何指定目标数据库(数据库B)的连接字符串。

我的SQL语句,像这样:

sql = INSERT INTO Database_B.Table (SELECT * FROM Database_B.Table); 

因为它是现在,我只指定数据库A的连接字符串:

sourceDatabaseConnectionString = "Server=localhost;Port=3306;Database=Database_A;Uid=root;Pwd=root;"; 

using (MySqlConnection connection = new MySqlConnection(sourceDatabaseConnectionString)) 
{ 
    connection.Open(); 

    using (MySqlCommand command = new MySqlCommand(sql, connection)) 
    { 
     command.CommandTimeout = 0; 
     command.ExecuteNonQuery(); 
    } 
} 

现在的事情是,这是工作完美。但是这两个数据库都在同一台服务器上,并具有相同的凭据。如果数据库放置在其他地方,我将如何处理它?

+2

我认为你唯一的选择是链接服务器。 – artm 2014-10-17 07:49:35

回答

0

我以OUTFILE语法解决了这个问题。这是我可以考虑解决这个问题的唯一方法,而不使用链接服务器,这对我的情况并不实用,因为我无法访问数据库,只接受来自用户的连接字符串。

我的解决方案首先执行SELECT语句并将数据写入文件。接下来,我的INSERT语句从文件中提取,并插入到另一个表中。

因此,这种方法避免了把数以百万计的记录在内存中,因为它们是两个独立的语句,我能结合每一个不同的连接字符串 - 因此,问题解决了:)

的代码与此类似:

statement1 = SELECT myFields INTO OUTFILE @file; 

statement2 = LOAD DATA LOCAL INFILE @file INTO TABLE myTable; 
1

我引用马哈茂德·贾迈勒的帖子谁提出这个答案在另一篇文章:

使用SELECT ... INTO ...有一个完全合格的表名 database.schema.object_name,就像这样:

USE DatabaseName;  
SELECT * FROM DatabaseName.schemaname.Tablename INSERT INTO 
AnotherDatabase.schemaname.AnotherTablename; 

然后你可以使用ADO.net或其他API执行从C#此查询。

来源:Inserting result of a SQL query from one database to another in C#

+0

这在技术上是我现在正在做的。我需要的是根据源和目标数据库的连接字符串以编程方式完成它。 – 2014-10-17 07:58:44

+0

你知道2个数据库的信息是什么? – 2014-10-17 08:00:27

+0

我不知道太多遗憾。我想将数据从一个数据库(任何位置的任何数据库)复制到另一个数据库(任何位置的任何数据库)。如果我将它分成两个单独的查询,这是可能的,但是我无法在内存中存储任何数据,因为我正在处理数百万条记录。 – 2014-10-17 08:02:13

相关问题