4

MySQL我在和中有两个数据库SQL Server,我想在 中创建表SQL Server并将表中的所有行复制MySQL到 中的新表中SQL Server

我可以使用以下代码创建与SQL Server相同的表MySQL

List<String> TableNames = new List<string>();
{ 
    IDataReader reader= 
        ExecuteReader("SELECT Table_Name FROM information_schema.tables WHERE table_name LIKE 'mavara%'",MySql);
    while (reader.Read()) {
        TableNames.Add(reader[0].ToString());
    }
    reader.Close();
}

foreach (string TableName in TableNames) {
    IDataReader reader = 
        ExecuteReader("SELECT Column_Name,IS_NULLABLE,DATA_TYPE FROM information_schema.columns where TABLE_Name='" + TableName + "'",MySql);
    List<string[]> Columns = new List<string[]>();
    while (reader.Read()) { 
        string[] column = new string[3];
        column[0] = reader[0].ToString();
        column[1] = reader[1].ToString();
        column[2] = reader[2].ToString();
        Columns.Add(column);
    }

    reader.Close();

    // create table
    string  queryCreatTables=  "CREATE TABLE [dbo].[" + TableName + "](\n";
    foreach(string[] cols in Columns)
    {
        queryCreatTables +="["+ cols[0] + "] " + cols[2] + " ";
        if (cols[1] == "NO")
            queryCreatTables += "NOT NULL";
        // else
        //   queryCreatTables += "NULL";
        queryCreatTables += " ,\n ";
    }
    queryCreatTables += ")";

    System.Data.SqlClient.SqlCommand smd = 
        new System.Data.SqlClient.SqlCommand(queryCreatTables, MsSql);
    System.Data.SqlClient.SqlDataReader sreader = smd.ExecuteReader();
    sreader.Close();

但我无法将一个表中的行复制到另一个表中。

对于选择查询,我使用 Idatareader,但我不知道如何将行插入另一个表。

4

7 回答 7

2

要将一个表中的行插入另一个表,请参考以下示例查询

    INSERT INTO Store_Information (store_name, Sales, Date)
    SELECT store_name, sum(Sales), Date
     FROM Sales_Information
于 2012-09-16T10:23:48.813 回答
1

算法如下:

1. For each table in source database
2.    Get a list of columns for that table
3.    Create table in destination database
4.    SELECT * FROM the table in source
5.    For each row in data
6.       Generate INSERT statement and execute on destination database

列所需的信息是NameTypeLength等。

然后通过迭代列来生成插入语句

var insertStatement = "INSERT INTO " + tableName + " VALUES( ";
foreach( var column in columns )
    insertStatement += "@" + column.Name + ",";
insertStatement[insertStatement.Length-1] = ')';

var command = new SqlCommand( insertStatement, MsSql );

// iterate over the columns again, but this time set values to the parameters
foreach( var column in columns )
   command.Parameters.AddWithValue( "@"+column.Name, currentRow[column.Name] );
于 2012-09-16T10:45:57.843 回答
0

但是我在将行从一个表复制到另一个表时遇到了问题。

您可以使用DataAdapterSqlDataAdapter.UpdateBatchSize对数据库执行批量更新/插入,以将数据从一个表复制到另一个表。在您使用以下方法从第一个 MYSQL 表中获取所有记录后:

//Get the rows from the first mysql table as you did in your question
DataTable mysqlfirstTableRowsTobeCopied = GetDataTableFromMySQLTable();

然后,您必须创建一个推荐文本,执行以下操作INSERT

cmd.CommandText = "INSERT INTO TableName Column_Name, ... VALUES(...)";

或者您可以使用存储过程:

CREATE PROCEDURE sp_BatchInsert ( @ColumnName VARCHAR(20), ... ) 
AS 
BEGIN 
            INSERT INTO TableName VALUES ( @ColumnNamne, ...); 
END

然后:

DataTable mysqlfirstTableRowsTobeCopied = GetDataTableFromMySQLTable();

SqlConnection conn = new SqlConnection("Your connection String");
SqlCommand cmd = new SqlCommand("sp_BatchInsert", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.UpdatedRowSource = UpdateRowSource.None;

// Set the Parameter with appropriate Source Column Name
cmd.Parameters.Add("@ColumnName", SqlDbType.Varchar, 50,
    mysqlfirstTableRowsTobeCopied.Columns[0].ColumnName);   
...
SqlDataAdapter adpt = new SqlDataAdapter();
adpt.InsertCommand = cmd;
// Specify the number of records to be Inserted/Updated in one go. Default is 1.
adpt.UpdateBatchSize = 20;

conn.Open();
int recordsInserted = adpt.Update(mysqlfirstTableRowsTobeCopied);   
conn.Close();

此代码实际上是从 codeproject 中有关此主题的完整教程中引用的,您可以参考它以获取更多信息:

于 2012-09-16T09:30:57.273 回答
0

假设您已经有一个数据表,其中包含要与另一个表合并的行...

有两种方法可以做到这一点……再次,假设您已经选择了数据并将其放入新表中。

            oldTable.Load(newTable.CreateDataReader());

            oldTable.Merge(newTable);
于 2020-12-15T00:15:19.607 回答
-1

通常是这样的。您可以直接在 SQL 中执行:INSERT INTO table FROM SELECT * FROM othertable;

于 2012-09-16T09:33:17.943 回答
-1

用于将所有记录插入新表(如果第二个表不存在)

从 Old_Table_Name 中选择 * 进入 New_Table_Name;

用于将所有记录插入第二个表(如果存在第二个表但表结构应该相同)

插入 Second_Table_Name from(Select * from First_Table_Name);

于 2013-09-04T10:00:19.930 回答
-1

以防万一它可以帮助某人,我找到了一种在 C# 中使用 SqlDataAdapter 的简单方法。它会自动检测表的结构,因此您不必枚举所有列或担心表结构的变化。然后在目标表中批量插入数据。

只要这两个表具有相同的结构,这将起作用。(例如,从生产表复制到开发空表。)

using(SqlConnection sqlConn = new SqlConnection(connectionStringFromDatabase))
    {
      sqlConn.Open();
      using(var adapter = new SqlDataAdapter(String.Format("SELECT * FROM [{0}].[{1}]", schemaName, tableName), sqlConn))
      {
        adapter.Fill(table);
      };
    }

    using(SqlConnection sqlConn = new SqlConnection(connectionStringDestination))
    {
      sqlConn.Open();
      // perform bulk insert
      using(var bulk = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.KeepIdentity|SqlBulkCopyOptions.KeepNulls, null))
      {
        foreach(DataColumn column in table.Columns)
        {
          bulk.ColumnMappings.Add(column.ColumnName, column.ColumnName);
        }
        bulk.DestinationTableName = String.Format("[{0}].[{1}]", schemaName, tableName);
        bulk.WriteToServer(table);
      }
    }
于 2019-12-06T18:11:12.967 回答