Я загружаю данные из таблицы 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
, который очень эффективно SqlBulkCopy
необработанный TDS на сервере. SqlBulkCopy
использует два типа ввода:
DataTable
IDataReader
Итак, в этот момент у вас есть 3 варианта:
List<AddServerPError>
в DataTable
вручную FastMember
для получения IDataReader
над существующим списком (пример этого находится внизу страницы проекта: https://github.com/mgravell/fast-member ) - на nuget: https: // www. nuget.org/packages/FastMember/ IDataReader
- есть CsvReader от 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>
ниже
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());
}