2010-10-07 9 views

risposta

4

Forse qualcosa come una copia Bulk sarebbe una risposta. L'esempio in Code Project di seguito mostra come farlo usando un DataTable, ma dovresti essere in grado di cambiare l'esempio per usare un DataSet.

Di seguito è riportata una piccola parte del codice che copre la connessione e l'esecuzione in SQL Server (preso da CodeProject).

La parte fondamentale da notare è il bulkcopy.WriteToServer (SourceTable); sono stati la SourceTable sarebbe la parte del DataSet si passa ad esso

//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

impostazione di una BatchSize appropriata e utilizzando SqlBulkCopyOptions.TableLock può provocare prestazioni molto migliori. Prova per il tuo scenario. Vedi http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx per un'analisi dettagliata. –

+0

@ Winston - Grazie per il link utile – kevchadders

3

Mentre SqlBulkCopy lavori per inserimenti di massa, non si può fare gli aggiornamenti di massa. Questo può o non può essere un problema per te, ma in ogni caso puoi utilizzare una stored procedure che utilizza OPENXML per consentire inserimenti e aggiornamenti di massa. Avrai anche bisogno di sp_xml_preparedocument e sp_xml_removedocument.

Un altro grande vantaggio di questo metodo è che è possibile ottenere gli ID delle entità appena aggiunte, utilizzando la clausola OUTPUT.

Esempio di un inserto di massa.

Supponendo di aver definito un parametro @p_XmlData VARCHAR(MAX) sul processo memorizzato che definisce i dati da inserire o aggiornare. Per un esempio di codice XML è necessario passare, si può fare:

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

Poi la stored procedure sarà simile a questa

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

Bella espansione sulla mia risposta + 1 – kevchadders

Problemi correlati