【问题标题】:Bulk upload strategy for SQL serverSQL server 的批量上传策略
【发布时间】:2018-07-19 08:10:11
【问题描述】:

我正在使用以下函数将数据从 CSV 上传到 SQL 表。

有没有更好的方法?

我担心,现在,连接会保持很长时间。因此需要减少。

   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;
            }
        }

存储过程

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 

【问题讨论】:

标签: c# sql .net sql-server sqlbulkcopy


【解决方案1】:

你最好的选择可能是SqlBulkCopy,它非常有效地向服务器抛出原始 TDS。 SqlBulkCopy 接受两种类型的输入:

  • DataTable
  • IDataReader

所以此时你有 3 个选择:

【讨论】:

  • 谢谢你的想法,你能帮我一些代码块吗?
  • @SmartestVEGA 好吧,我已经提供的链接中有第二个选项的确切示例;第三个选项的代码看起来非常相似,但使用 using (var reader = new CsvReader(source, ...)) 而不是 ObjectReader...
  • 通过对 EUCUsecaseGroupInputParam WHERE 1 = 0 进行空查询来创建一个空的数据表,然后用行填充表,将数据放在所需的列中,然后将数据表触发到 sqlBulkCopy - 只需查看sqlBulkCopy 需要的参数,据我回忆,它们都相当明显
【解决方案2】:

您可以考虑使用Cinchoo ETL,这是一个开源库,可以将 CSV 文件批量上传到数据库。

选项 1:

将 CSV 文件直接加载到数据库

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());
    }
}

选项 2:

如果CSV的加载已经完成并输出为List&lt;AddServerPError&gt;,您仍然可以将它们上传到数据库,如下所示

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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2015-05-20
    • 2014-02-17
    相关资源
    最近更新 更多