Windows Mobile v6 で .NET Compact Framework 3.5 アプリケーションに sqlite を使用しています。大きなデータを挿入すると、速度が低下する問題に直面しています。
次の状況を考えてみましょう: 私のArrayList
(たとえばList1
) には約 150 個のアイテムがあります。itemid
そして、2 つの列 (たとえばと)を持つデータベース テーブルがありますisFound
。
各要素を反復処理しList1
、itemid が使用可能かどうかをデータベースで確認する必要があります
- itemid がテーブルで使用可能な場合は、 isFound ステータスを 1 に更新します。
- itemid が利用できない場合は、isFound ステータスを挿入して更新します。
これには約 30 秒かかります。最速の方法は何ですか?
これが私の現在のコードです:
public ArrayList InsertNewlyScannedItems(ref ArrayList newlyScannedItemList)
{
ArrayList newInsertedItemList = new ArrayList();
SQLiteConnection conn = new SQLiteConnection("Data Source=" + db + ";Version=3;");
SQLiteDataReader rs = null;
try
{
conn.Open();
SQLiteCommand availableTable = conn.CreateCommand();
IEnumerator en = newlyScannedItemList.GetEnumerator();
while (en.MoveNext())
{
ItemInfo itmInfo = (ItemInfo)en.Current;
string cmdText = "";
cmdText = "Select id, isFound item where id = '" + itmInfo.id + "'";
availableTable.CommandText = cmdText;
rs = availableTable.ExecuteReader();
if (rs.Read())
{
if (!itmInfo.id.Equals(""))
{
availableTable.Dispose();
availableTable.CommandText = "UPDATE item SET isFound = @isFound Where id = @id";
availableTable.Parameters.AddWithValue("@isFound", itmInfo.isFound);
availableTable.Parameters.AddWithValue("@id", itmInfo.id);
availableTable.ExecuteNonQuery();
}
}
else
{
availableTable.Dispose();
cmdText = "INSERT INTO item(id, isFound)";
cmdText += "VALUES ( '" + itmInfo.id + "','" + itmInfo.isFound + ")";
availableTable.CommandText = cmdText;
availableTable.ExecuteNonQuery();
}
newInsertedItemList.Add(itmInfo);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (rs != null)
{
//rs.Close();
//rs.Dispose();
}
if (conn != null && conn.State == ConnectionState.Open)
{
conn.Close();
conn = null;
}
}
return newInsertedItemList;
}