我需要帮助加快我的应用程序。应用程序读取大约53,000行分隔记录,解析每一行,然后继续将每行发送到要写入的数据库。到目前为止,我已经将数据库结束确定为主要瓶颈,我将非常感谢帮助调整它。目前,处理所有记录(53,000)大约需要20分钟,每个记录包含190个字段,我希望从将数据发送到数据库的代码开始大幅减少该数量。
我使用Enterprise Library 5,利用那里的连接池)连接到数据库,如此
internal void SaveItem(String connString)
{
try
{
ImportDataAccessor dbacess = new ImportDataAccessor(connString);
foreach (ItemDetail item in itemEZdetails)
{
if (dbacess.SaveProduct(RecordID, item))
{
updatecounter++;
}
}
successfulsaves = dbacess.RowsProcessed;
updatecounter = dbacess.TotalRows;
}
catch (Exception ex)
{
throw ex;
}
}
public bool SaveProduct(String RecordUID, ItemDetail item)
{
//. . . . start function here
DbCommand insertCommand = db.GetStoredProcCommand("IDW_spEZViewRecordImport");
db.AddInParameter(insertCommand, "SessionUID", DbType.String, recordUID);
// the other 189 Parameters go here
int rowsAffected = db.ExecuteNonQuery(insertCommand);
// Object sreturnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
String returnval = String.Empty;
if ( ! (db.GetParameterValue(insertCommand, "ReturnVal") == DBNull.Value))
returnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
if (returnval == "60")
RowsProcessed++;
result = rowsAffected > 0;
}
//end of line add
如何使用我现在的代码实现这一目标。提前致谢。
答案 0 :(得分:1)
使用SQLBulkCopy,因为输入多行时速度非常快。
DataTable newProducts = MakeTable();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(newProducts);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
你只需要传递一个匹配列名的DataTable
,瞧!
答案 1 :(得分:0)
通过在存储过程中使用多个记录INSERT命令,可能会获得更好的性能,如下所示:
Insert into ItemType (ItemTypeName)
VALUES
('TYPE1'),
('TYPE2'),
('TYPE3')