簡體   English   中英

如何改善C#代碼以將數據從MS Access讀取到二維數組中?

[英]How can I improve my C# code to read data from MS Access into a 2d-array?

我的C#代碼可以正常工作,但是處理大約18萬行數據需要一個小時。 我正在尋找提高性能的方法。 在讀取新數據時,是否存在更快或更佳的方法來增加數組,或者SQL語句會更有效? 謝謝。

int row = 0;
string[,] timeSeriesData = new string[row, colSize];
using (OleDbConnection AccessConn = new OleDbConnection(strAccessConn))
{
    OleDbCommand cmdGetData = AccessConn.CreateCommand();
    cmdGetData.CommandText = sqlSELECT;

    AccessConn.Open();
    OleDbDataReader thisReader = cmdGetData.ExecuteReader();
    while (thisReader.Read())
    {
        string[,] tempArray = new string[row + 1, colSize];
        Array.Copy(timeSeriesData, tempArray, timeSeriesData.Length);
        timeSeriesData = tempArray;

        timeSeriesData[row, 0] = thisReader.GetDateTime(0).ToOADate().ToString();
        for (int j = 1; j < colSize; j++)
        {
            if (thisReader.IsDBNull(j))     
            {
                timeSeriesData[row, j] = "-999";  
            }
            else
            {
                timeSeriesData[row, j] = Convert.ToString(thisReader[j]);
            }
         }
         row++;
    }
    thisReader.Close();
    AccessConn.Close();
}

我的SQL語句通常是這樣的:

SELECT [TimeStamp], IIF([CH1Avg_Qual] IS NULL OR [CH1Avg_Qual]=0, [CH1Avg], NULL) AS Col1, 
IIF([CH2Avg_Qual] IS NULL OR [CH2Avg_Qual]=0, [CH2Avg], NULL) AS Col2, 
IIF([CH3Avg_Qual] IS NULL OR [CH3Avg_Qual]=0, [CH3Avg], NULL) AS Col3, 
IIF([CH7Avg_Qual] IS NULL OR [CH7Avg_Qual]=0, [CH7Avg], NULL) AS Col4, 
IIF([CH9Avg_Qual] IS NULL OR [CH9Avg_Qual]=0, [CH9Avg], NULL) AS Col5, 
IIF([CH10Avg_Qual] IS NULL OR [CH10Avg_Qual]=0, [CH10Avg], NULL) AS Col6, 
IIF([CH11Avg_Qual] IS NULL OR [CH11Avg_Qual]=0, [CH11Avg], NULL) AS Col7 
FROM [DataTable] ORDER BY [TimeStamp]

在數據庫和數據讀取器之間的往返過程中,您可能會有很多額外的開銷。 您正在通過連接逐行封送數據,這通常是過程中最慢的部分。

您最好使用數據集,將所有記錄放入其中,然后迭代該數據集並構建數組。 DataSet將位於本地存儲中,因此訪問速度應該更快。

另一種選擇是使用Access VBA生成所需的結果並將其存儲在表中。 然后,再次使用DataSet從Access中拉出整個表。 如果您只使用了180,000條記錄的一小部分(這在我看來不是這種情況),那將是更好的選擇,因為您無需在迭代之前將所有記錄都放入DataSet中。

感謝@BobRodes將我指向DataTable。 下面的代碼從以前的18分鍾到使用DataTable的7秒提高了一個數據集的性能:)該代碼也非常簡單。

DataTable timeSeriesDataDT = new DataTable();
using (OleDbConnection AccessConnDT = new OleDbConnection(strAccessConn))
{
    using (OleDbCommand cmdGetDT = new OleDbCommand(sqlSELECT, AccessConnDT))
    {
        AccessConnDT.Open();
        OleDbDataAdapter adapter = new OleDbDataAdapter(cmdGetDT);
        adapter.Fill(timeSeriesDataDT);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM