0

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;
}
4

0 に答える 0