2011-03-08 33 views
5

Necesito generar un script TSQL desde un DataTable junto con los DATA en él. No es un solo inserto. Además de eso, necesito crear la tabla también (misma estructura de tabla de datos)Convertir un DataTable a un script CREATE TABLE + INSERT para SQL en C#

así que: Tengo una DataTable llena de datos. Quiero la secuencia de comandos TSQL que crea la estructura de esta DataTable junto con los datos en el mismo servidor SQL (CREATE TABLE + INSERT)

gracias de antemano y un agradecimiento especial a John Saunders por ayudarme a corregir el problema.

+0

¿Qué versión de .NET está usando? DataTable es una tecnología bastante primitiva y no tiene una forma integrada de hacer lo que está pidiendo. –

+0

Estoy usando Framework 3.5 vs 2010 –

+0

, entonces debería mirar Entity Framework, que tiene la capacidad de crear el modelo de base de datos, crear la tabla y luego actualizarla. DataTable está bastante desactualizado. –

Respuesta

1

Tome un vistazo a: Generate SQL INSERT commands programmatically

En esencia, el código es un bucle a través de la colección DataTable.Columns para generar la lista de columnas de la instrucción INSERT. A continuación, recorre los valores de DataTable para crear los parámetros con valores.

14

En primer lugar, me gustaría utilizar este objeto para build your CREATE TABLE command.

Entonces me gustaría utilizar SQL bulkcopy en lugar de las instrucciones INSERT separadas.

public static void BulkInsertDataTable(string connectionString, string tableName, DataTable table) 
     { 
      using (SqlConnection connection = new SqlConnection(connectionString)) 
      { 
       SqlBulkCopy bulkCopy = 
        new SqlBulkCopy 
        (
        connection, 
        SqlBulkCopyOptions.TableLock | 
        SqlBulkCopyOptions.FireTriggers | 
        SqlBulkCopyOptions.UseInternalTransaction, 
        null 
        ); 

       bulkCopy.DestinationTableName = tableName; 
       connection.Open(); 

       bulkCopy.WriteToServer(table); 
       connection.Close(); 
      } 
     } 
+12

Su enlace "Crear comando de tabla" está roto :-( –

0

Utilice la herramienta creada por mí si desea crear el guión insert de la mesa. Esto crea Insert secuencia de comandos en la tabla múltiple basada en condición dada:

IF NOT EXISTS (Select 1 from Table1 WHERE Col1='Col1' AND Col2='Col2') 
INSERT INTO Table1 (Col1,Col2,Col3,Col4) VALUES (1,'abc',null,'2012-01-01') 

Aquí está el enlace: http://www.codeproject.com/Tips/330864/Generate-Insert-script-to-extract-data

+0

Leí ese artículo dos veces, pero no está claro qué está haciendo. – Muflix

4
public void createsqltable(DataTable dt,string tablename) 
     { 
      string strconnection = ""; 
      string table = ""; 
      table += "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + tablename + "]') AND type in (N'U'))"; 
      table += "BEGIN "; 
      table += "create table " + tablename + ""; 
      table += "("; 
      for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       if (i != dt.Columns.Count-1) 
        table += dt.Columns[i].ColumnName + " " + "varchar(max)" + ","; 
       else 
        table += dt.Columns[i].ColumnName + " " + "varchar(max)"; 
      } 
      table += ") "; 
      table += "END"; 
      InsertQuery(table,strconnection); 
      CopyData(strconnection, dt, tablename); 
     } 
     public void InsertQuery(string qry,string connection) 
     { 


      SqlConnection _connection = new SqlConnection(connection); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = qry; 
      cmd.Connection = _connection; 
      _connection.Open(); 
      cmd.ExecuteNonQuery(); 
      _connection.Close(); 
     } 
     public static void CopyData(string connStr, DataTable dt, string tablename) 
     { 
      using (SqlBulkCopy bulkCopy = 
      new SqlBulkCopy(connStr, SqlBulkCopyOptions.TableLock)) 
      { 
       bulkCopy.DestinationTableName = tablename; 
       bulkCopy.WriteToServer(dt); 
      } 
     } 
+0

Agregué llaves sobre 'dt.Columns [i] .ColumnName' para evitar el lanzamiento de nombres de columna error cuando contienen espacios – Muflix

Cuestiones relacionadas