[英]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.