2012-09-16 7 views
3

J'ai deux bases de données dans MySQL et SQL Server, et je veux créer des tables dans SQL Server et copier toutes les lignes de la table MySQL dans la nouvelle table SQL Server.copier toutes les lignes d'une table à une autre table

Je peux créer table SQL Server même que MySQL, avec ce code:

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(); 

mais j'ai problème de copier des lignes d'une table dans une autre table.

pour une requête de sélection, j'utilise Idatareader, mais je ne sais pas comment insérer des lignes dans une autre table.

+0

Cela ressemble à quelque chose qui serait vraiment mieux géré au niveau du SGBD. Ou est-ce que cette migration est quelque chose qui est souvent entreprise et vous avez besoin d'un programme pour automatiser la procédure? –

+0

oui. J'ai besoin d'un programme pour gérer cela – atabrizi

Répondre

1

L'algorithme est le suivant:

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 

Les informations dont vous avez besoin pour une colonne est Name, Type , Length, etc.

Ensuite, vous créez l'instruction d'insertion par itérer sur les colonnes

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]); 
0

Mais j'ai un problème pour copier des lignes d'une table dans une autre table.

Vous pouvez utiliser le SqlDataAdapter.UpdateBatchSize pour perform Batch Updates/Inserts with a DataAdapter contre la base de données pour copier les données d'une table à l'autre. Une fois que vous obtenez tous les enregistrements de la première table MYSQL en utilisant quelque chose comme:

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

Ensuite, vous devez créer un texte de Commend qui font le INSERT quelque chose comme:

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

Ou vous pouvez utiliser une procédure stockée :

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

Puis:

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(); 

Ce code est en fait cité d'un tutoriel complet sur ce sujet dans le CodeProject, vous pouvez consulter pour plus d'informations:

+0

j'ai lu cet article mais je ne sais pas le nom de la colonne et son type pour insérer la requête – atabrizi

+0

@atabrizi, Reportez-vous au studio MS Sql serveur de gestion pour comprendre son nom et son type de données, puis choisissez le type de données ADO.NET correspondant à ce type. –

+0

si vous lisez mon code, vous pouvez voir que je creat table de la table mysql et je ne sais pas le nom des colonnes. et j'ai 170 tables.i besoin de programme pour gérer toutes ces tables – atabrizi

0

Habituellement, c'est STH. vous pouvez le faire directement en SQL: INSERT INTO table FROM SELECT * FROM othertable;

+0

l'une de mes tables était dans le serveur sql et un autre était dans mysql et je ne peux pas utiliser ce code – atabrizi

2

Pour insérer des lignes d'une table dans une autre table s'il vous plaît consulter le ci-dessous exemple de requête

INSERT INTO Store_Information (store_name, Sales, Date) 
    SELECT store_name, sum(Sales), Date 
    FROM Sales_Information 
-1

Pour l'insertion de tous les enregistrements dans le nouveau tableau (Si la deuxième table existe pas)

Sélectionnez * dans New_Table_Name de Old_Table_Name;

Pour l'insertion de tous les enregistrements dans Second tableau (Si la deuxième table existent, mais la structure de la table doit être identique)

Insérer dans Second_Table_Name de (Select * from First_Table_Name);

Questions connexes