[英]Bulk upload strategy for SQL server
我正在使用以下功能將數據從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
您最好的選擇可能是SqlBulkCopy
,它可以非常有效地將原始TDS SqlBulkCopy
服務器。 SqlBulkCopy
接受兩種類型的輸入:
DataTable
IDataReader
因此,此時您有3個選擇:
List<AddServerPError>
轉換為DataTable
FastMember
的方法在現有列表上獲取IDataReader
(此示例在項目頁面的底部: https: //github.com/mgravell/fast-member )-在nuget上: https:// www。 nuget.org/packages/FastMember/ IDataReader
直接讀取CSV-有一個“ LumenWorks” CsvReader
一直可以很好地工作; 我可以看到的最接近的nuget鏈接是https://www.nuget.org/packages/LumenWorksCsvReader/ (盡管這不是原始鏈接,但已進行了擴展) 您可以考慮使用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<AddServerPError>
輸出,則仍然可以按如下所示將它們上傳到數據庫
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());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.