Потеря производительности преобразование приложения QBFC из VBA в C#C#

Место общения программистов C#
Anonymous
 Потеря производительности преобразование приложения QBFC из VBA в C#

Сообщение Anonymous »

Я преобразую старое приложение MSACCESS 2013 VBA, которое интегрируется с QuickBooks (2021 Desktop) через QBFC15 в передний конец MSACCESS 365/ SQL Server с приложением C#, которое выполняет интеграцию.
Я застрял в ужасных проблемах с производительностью при выполнении GeneralDetailReport (gdrttxndetailbyaccount) моих полных деталей QB набор данных. Это около 60 тысяч записей, и когда я использую свой VBA, он преобразует около 1000 записей/SEC в мой набор записей доступа ... Другими словами занимает около минуты, чтобы получить и хранить данные. Но выполняя то же самое в моем коде C# (помогая ИИ), лучшее, что я могу получить, - это около 15 записей/набора, что делает задачу в основном невозможной для запуска. Я даже просто перечисляю строки без какого -либо дополнительного доступа к данным, и он по -прежнему управляет только 75 записями/сек. Есть ли советы, чтобы исправить этот разрыв в производительности? Он довольно быстро извлекает данные из QB, это конвертирование объекта COM в используемые данные DataTables, что они настолько медленные. Все эти накладные расходы .NET с управляемыми /неуправляемыми данными. В цикле: < /p>
vba: < /p>
For i3720 = 0 To ReportRet.ReportData.ORReportDataList.Count - 1
If Not ORReportData3721.DataRow Is Nothing Then
If Not ORReportData3721.DataRow.ColDataList Is Nothing Then
' Use the predetermined column IDs to get the specific data
Set ColData = ORReportData3721.DataRow.ColDataList.GetAt(vartransnumber_id)
vartransnumber = ColData.Value.GetValue

Set ColData = ORReportData3721.DataRow.ColDataList.GetAt(vartype_id)
vartxnType = ColData.Value.GetValue

Set ColData = ORReportData3721.DataRow.ColDataList.GetAt(varaccount_id)
varaccount = ColData.Value.GetValue
' ...continue for about 15 columns of data
End If
End If
Next
< /code>
c# code: < /p>
// Process rows with direct access
for (int dataRowIndex = 0; dataRowIndex < reportDataList.Count; dataRowIndex++)
{
var reportData = reportDataList.GetAt(dataRowIndex);
if (reportData?.DataRow?.ColDataList == null)
continue;

var colList = reportData.DataRow.ColDataList;
try
{
// Direct assignments with null checks
colData = colList.GetAt(transNumPos);
_dataArray[rowIndex, 0] = colData?.value?.GetValue()?.ToString() ?? "";

colData = colList.GetAt(typePos);
_dataArray[rowIndex, 1] = colData?.value?.GetValue()?.ToString() ?? "";

colData = colList.GetAt(datePos);
_dataArray[rowIndex, 2] = colData?.value?.GetValue()?.ToString() ?? "";
//...similar for 15 columns
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... to-c-sharp

Вернуться в «C#»