性能调优分隔文件读取和写入数据库

时间:2012-10-17 16:15:36

标签: c# winforms multithreading enterprise-library

我需要帮助加快我的应用程序。应用程序读取大约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

如何使用我现在的代码实现这一目标。提前致谢。

2 个答案:

答案 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')