2010-07-27 22 views
7

¿Hay alguna forma de insertar a granel una System.Data.DataTable en C# en una tabla de SQL Server utilizando un procedimiento de almacenamiento y pasando esta tabla como parámetro?Inserte los datos de la tabla C# en una tabla de SQL Server

La tabla no tendrá un número fijo de registros.

+1

¿Qué versión de SQL Server? 2008? –

Respuesta

6

Sí hay una manera:

 DataTable dataTable = null; // your data needs to be here 
     try 
     { 
      ConnectionStringSettings mConString = ConfigurationManager.ConnectionStrings["SiteSqlServer"]; 

      // Optional truncating old table 
      using (SqlConnection connection = new SqlConnection(mConString.ConnectionString)) 
      { 
       connection.Open(); 
       // Delete old entries 
       SqlCommand truncate = new SqlCommand("TRUNCATE TABLE MYTABLE", connection); 
       truncate.ExecuteNonQuery(); 
      } 

      SqlBulkCopy bulkCopy = new SqlBulkCopy(mConString.ConnectionString, SqlBulkCopyOptions.TableLock) 
              { 
               DestinationTableName = "dbo.MYTABLE", 
               BatchSize = 100000, 
               BulkCopyTimeout = 360 
              }; 
      bulkCopy.WriteToServer(dataTable); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

favor experiement con el BatchSize - 100000 fue bueno para mí - no debe ser mayor que - Velocidad migth disminuir lo contrario. BatchSize no limita sus datos; es solo el tamaño de cada "paquete" que se enviará al servidor sql.

SiteSQLServer debe estar dentro de su app.config o web.config. Necesita cambiar los parámetros aquí si no.

Por favor, cambie MYTABLE a su nombre de tabla.

+0

Andread, eso funciona bien, pero ¿y si tienes un DBA obstinado que no le da permisos de inserción masiva ... ??? entonces qué – MethodMan

+0

Esto no funcionaría. Pero esta no era la pregunta ... La inserción masiva debería estar habilitada para usar esto y este es el valor predeterminado. –

2

En las versiones de SQL Server anteriores a 2008, la única forma de enviar una DataTable completa a SQL Server era SqlBulkCopy. Debe insertar todos los datos en la tabla de etapas (probablemente temporal) y llamar al procedimiento para procesar los datos por etapas.

En SQL Server 2008, se han introducido tipos definidos por el usuario con valores de tabla. Proporcionan algunas excelentes opciones nuevas para trabajar con conjuntos de datos.

Tenga una mirada en MSDN:

y probablemente un segundo a dos de mis blogs:

+0

Agradable, pero más lento que bulkcopy ... –

+0

Claro, más lento (sin embargo, no demasiado) pero más poderoso, ya que no se necesita tabla de etapas –

+0

hola Florian, Solo intento ejecutar algo como esto pero no funciona. .. USE AdventureWorks; GO /* Crear un tipo de tabla definida por el usuario */ CREATE TYPE LocationTableType AS TABLA (LocationName VARCHAR (50) , CostRate INT); GO Tengo AdventureWorks db en mi SQL Server, ¿no debería ser capaz de crear el nuevo tipo? Acabo de recibir este error ... Msg 156, nivel 15, estado 1, línea 3 Sintaxis incorrecta cerca de la palabra clave 'AS'. Gracias –

Cuestiones relacionadas