2015-06-18 3 views
0

Привет, у меня есть проблема с моим сценарием на C#, в основном он должен запускаться через массив списка, а затем обновлять значения в базе данных sqlite, но он, кажется, блокируется при попытке обновить базу данных, это мой кодSQLite Блокировка базы данных Mutli Query

using UnityEngine; 
using System.Collections; 
using Parse; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using Mono.Data.Sqlite; 
using System.Data; 
using System.Threading.Tasks; 

public class MyTestArray : MonoBehaviour { 

    public int MyInt; 
    // Use this for initialization 
    void Start() { 
     int[] pets = { 1, 2, 3, 4, 5 }; 

     // ... Loop with the foreach keyword. 
     foreach (int value in pets) { 
      Debug.Log (value); 

      MyInt = value; 

      string sqlQuery; 
      string conn = ""; 
      #if UNITY_EDITOR 
      conn = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
      #elif UNITY_IPHONE 

      conn = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
      #elif UNITY_STANDALONE_WIN 
      conn = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
      #elif UNITY_ANDROID 
      conn = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
      #endif 
      IDbConnection dbconn; 
      dbconn = (IDbConnection)new SqliteConnection (conn); 
      dbconn.Open(); //Open connection to the database. 
      IDbCommand dbcmd = dbconn.CreateCommand(); 
      PlayerPrefs.SetString ("Question", "1"); 

      sqlQuery = "select SUM(qo.Score) from [Answer] as a inner join Questionas qo on a.Question= qo.QuestionI inner join Question as q on qo.QuestionId = q.QuestionId where q.QID=" + value; 
      dbcmd.CommandText = sqlQuery; 
      IDataReader reader = dbcmd.ExecuteReader(); 
      while (reader.Read()) { 
       int RiskNumber = reader.GetInt32 (0); 
       Debug.Log (RiskNumber); 
       string sqlQuery2 = ""; 
       string conn2 = ""; 
       #if UNITY_EDITOR 
       conn2 = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
       #elif UNITY_IPHONE 

       conn2 = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
       #elif UNITY_STANDALONE_WIN 
       conn2 = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
       #elif UNITY_ANDROID 
       conn2 = "URI=file:" + Application.persistentDataPath + "/" + "DB.db"; 
       #endif 
       IDbConnection dbconn2; 
       dbconn2 = (IDbConnection)new SqliteConnection (conn2); 
       dbconn2.Open(); //Open connection to the database. 
       IDbCommand dbcmd2 = dbconn2.CreateCommand(); 
       if (MyInt == 1){ 
        sqlQuery2 = "UPDATE UserScore SET MyScore1="+RiskNumber; 
       } else if (MyInt == 2){ 
        sqlQuery2 = "UPDATE UserScore SET MyScore2="+RiskNumber; 
       } else if (MyInt == 3){ 
        sqlQuery2 = "UPDATE UserScore SET MyScore3="+RiskNumber; 
       } else if (MyInt == 4){ 
        sqlQuery2 = "UPDATE UserScore SET MyScore4="+RiskNumber; 
       } else if (MyInt == 5){ 
        sqlQuery2 = "UPDATE UserScore SET MyScore5="+RiskNumber; 
       } 

       Debug.Log (sqlQuery2); 
       dbcmd2.CommandText = sqlQuery2; 
       IDataReader reader2 = dbcmd2.ExecuteReader(); 


       reader2.Close(); 
       reader2 = null; 
       dbcmd2.Dispose(); 
       dbcmd2 = null; 
       dbconn2.Close(); 
       dbconn2 = null; 
      } 




      reader.Close(); 
      reader = null; 
      dbcmd.Dispose(); 
      dbcmd = null; 
      dbconn.Close(); 
      dbconn = null; 
     } 
    } 

    } 

ли способ я создаю запрос или я что-то пропустил любая помощь будет фантастическим веселит

+2

Почему у вас есть открытие соединения в цикле? Вам нужно открыть соединение с базой данных только один раз. Перед тем, как открыть другую, вам придется удалить существующее соединение. –

+0

Не могли бы вы показать мне, что я могу извлечь из своего кода, чтобы он работал лучше? Если бы вы могли это быть фантастическим, я думаю, что это просто соединение, но есть больше, что я мог бы удалить. Приветствия – albaslayer

+1

У вас есть принятый ответ. Поэтому я надеюсь, что ваша проблема решена. Но все же, если я получу некоторое время, я добавлю ответ с оптимизированным кодом. –

ответ

2

о мальчик вам действительно нужно рассмотреть рефакторинга часть этого кода, не самое лучшее для однако проблема заключается в том, что вы открываете другое соединение, но при открытии основного подключения просто повторно используйте тот же самый код nection.

Это happends в цикле в то время как

Edit: Замечая ваш код, он выглядит, как вы должны быть в состоянии сделать один запрос SQL, обновив из отборной, поэтому нет необходимости чрезмерного зацикливания

+0

Спасибо, я получил это приветствия – albaslayer

Смежные вопросы