2010-10-07 8 views

Respuesta

4

Tal vez algo como una copia masiva sería una respuesta. El ejemplo en Code Project a continuación muestra cómo hacerlo usando una DataTable, pero debería poder cambiar el ejemplo para usar un DataSet.

A continuación se muestra una pequeña parte del código que abarca la detección y la eliminación en SQL Server (tomado de CodeProject).

La parte clave a tener en cuenta es bulkcopy.WriteToServer (SourceTable); fueron los SourceTable sería la parte del conjunto de datos que pasaría a ella

//First create a connection string to destination database 
string connectionString; 
connectionString = <EM>YourConnectionString</EM>and 
    Initial Catalog=TestSMODatabase"; 

//Open a connection with destination database; 
using (SqlConnection connection = 
     new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    //Open bulkcopy connection. 
    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(connection)) 
    { 
    //Set destination table name 
    //to table previously created. 
    bulkcopy.DestinationTableName = "dbo.TestTable"; 

    try 
    { 
     bulkcopy.WriteToServer(SourceTable); // SourceTable would come from your DataSet 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

    connection.Close(); 
    } 
} 
+1

Configuración de una BatchSize apropiado y utilizando SqlBulkCopyOptions.TableLock puede resultar en un rendimiento mucho mejor. Prueba tu escenario. Consulte http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx para un análisis detallado. –

+0

@ Winston - Gracias por el útil enlace – kevchadders

3

Mientras SqlBulkCopy obras para las inserciones, que no pueden hacer actualizaciones masivas. Esto puede o no ser un problema para usted, pero en cualquier caso puede utilizar un procedimiento almacenado que utiliza OPENXML para permitir inserciones y actualizaciones masivas. También necesitará sp_xml_preparedocument y sp_xml_removedocument.

Otra gran ventaja de este método es que puede obtener los identificadores de las entidades que acaba de insertar a granel, utilizando la cláusula OUTPUT.

Ejemplo de inserción a granel.

Suponiendo que ha definido un parámetro @p_XmlData VARCHAR(MAX) en el proceso almacenado que define los datos para insertar o actualizar. Para un ejemplo del XML que necesita para pasar, puede hacer:

SELECT TOP 1 *, 0 AS __ORDERBY FROM dbo.YourEntity AS YourEntity FOR XML AUTO, ROOT('ROOT') 

A continuación, el procedimiento almacenado se verá algo como esto

DECLARE @hDoc INT 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData 

INSERT INTO dbo.YourEntity 
(
     [Field1], 
     [Field2] 
) 
SELECT 
     XMLData.Field1, 
     XMLData.Field2 
FROM OPENXML (@hdoc, 'ROOT/YourEntity', 1) 
WITH 
(
     [Field1] int, 
     [Field2] varchar(50), 
     [__ORDERBY] int 
) AS XMLData 

EXEC sp_xml_removedocument @hDoc 
+0

Bonita expansión en mi respuesta + 1 – kevchadders

0

propongo que usted envía a sus tablas de datos de usted conjunto de datos a un procedimiento almacenado que usa un parámetro de valor de tabla. A continuación, puede realizar una instrucción de inserción para rellenar la base de datos con sus registros de conjunto de datos.

http://msdn.microsoft.com/en-us/library/bb510489.aspx

Cuestiones relacionadas