Strategia di caricamento collettivo per server SQL

.net c# sql sqlbulkcopy sql-server

Domanda

Sto caricando i dati da CSV alla tabella SQL utilizzando la seguente funzione.

C'è un modo migliore per farlo?

Sono preoccupato, in questo momento, di mantenere la connessione per lungo tempo. Quindi deve essere ridotto.

   public bool SaveProxyBulkUploadData(List<AddServerPError> saveBulkUploadData)
        {
            try
            {
                foreach (AddServerPError addServetData in saveBulkUploadData)
                {
                    DbCommand dbCmd = CitiScriptExecutionDB.GetStoredProcCommand("USP_HS_InsertProxyBulkUploadData");
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@groupid", DbType.String, addServetData.GroupId);
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@proxyname", DbType.String, addServetData.ProxyName);
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@proxytype", DbType.String, addServetData.ProxyType);
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@sa_spoc_dl", DbType.String, addServetData.SA_SPOC_DL);
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@assignmentgroup", DbType.String, addServetData.AssignmentGroup);
                    CitiScriptExecutionDB.AddInParameter(dbCmd, "@createdby", DbType.String, addServetData.CreatedBy);
                    CitiScriptExecutionDB.ExecuteNonQuery(dbCmd);
                }

                return true;
            }
            catch (Exception ex)
            {
                string msg = ex.Message + ex.StackTrace;
                throw;
            }
        }

Procedura memorizzata

CREATE PROCEDURE USP_HS_InsertBulkUploadData   
 @groupid  int,  
 @hostname varchar(50),   
 @type1 varchar(50),  
 @type2 varchar(50),  
 @createdby varchar(50)       
AS        
BEGIN       

 Insert into [dbo].[EUCUsecaseGroupInputParam]    
 (    
  GroupId,  
  HostName,    
  Type1,    
  Type2,     
  CreatedBy,     
  CreatedDate,     
  UpdatedBy,    
  UpdatedDate,    
  IsActive    
  )        
 Values(   
  @groupId,  
  @hostname,    
  @type1,    
  @type2,    
  @createdby,    
  GetDate(),    
  null,    
  null,    
  1    
  )       
END 

Risposta esperta

La tua migliore scommessa qui è probabilmente SqlBulkCopy , che genera TDS non SqlBulkCopy sul server in modo molto efficiente. SqlBulkCopy accetta due tipi di input:

  • DataTable
  • IDataReader

Quindi a quel punto hai 3 opzioni:


Risposta popolare

Puoi prendere in considerazione l'utilizzo di Cinchoo ETL , una libreria open source per eseguire il caricamento in blocco del file CSV nel database.

Opzione 1:

Carica il file CSV direttamente nel database

string connectionstring = @"#YOUR DB ConnectionString#";
using (SqlBulkCopy bcp = new SqlBulkCopy(connectionstring))
{
    using (var p = new ChoCSVReader("#YOUR CSV FILE#"))
    {
        bcp.DestinationTableName = "#TABLENAME#";
        bcp.EnableStreaming = true;
        bcp.BatchSize = 10000;
        bcp.BulkCopyTimeout = 0;
        bcp.NotifyAfter = 100;
        bcp.SqlRowsCopied += delegate (object sender, SqlRowsCopiedEventArgs e)
        {
            Console.WriteLine(e.RowsCopied.ToString("#,##0") + " rows copied.");
        };
        bcp.WriteToServer(p.AsDataReader());
    }
}

Opzione 2:

Se il carico di CSV è già stato eseguito e inviato come List<AddServerPError> , è comunque possibile caricarli nel database come di seguito

List<AddServerPError> objs = # Your input objects #;

string connectionstring = @"#YOUR DB ConnectionString#";
using (SqlBulkCopy bcp = new SqlBulkCopy(connectionstring))
{
    bcp.DestinationTableName = "#TABLENAME#";
    bcp.EnableStreaming = true;
    bcp.BatchSize = 10000;
    bcp.BulkCopyTimeout = 0;
    bcp.NotifyAfter = 100;
    bcp.SqlRowsCopied += delegate (object sender, SqlRowsCopiedEventArgs e)
    {
        Console.WriteLine(e.RowsCopied.ToString("#,##0") + " rows copied.");
    };
    bcp.WriteToServer(objs.AsDataReader());
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché