2016-05-06 5 views
0

SQLiteを使用してデータベースにアイテムを挿入しようとしていますが、loadfunctionを呼び出すときにインデックス外のエラーが発生します。私は問題が私が関数を呼び出すときだと思う。私はパラメータの値を確認し、すべてが正常であるようだが、要素はテーブルに挿入されていません。あなたは私のテーブルが表示され、機能と負荷機能を追加します。C#でSQLiteを使用してデータベースに項目を挿入する際の問題点

テーブル:

CREATE TABLE `Fisiere` (
    `Nume` TEXT, 
    `Dimensiune` INTEGER, 
    `Data` BLOB, 
    `Rating_imdb` REAL, 
    `Cale` TEXT 
); 

挿入機能:

public void addFisier(DirectorVideo[] directors) 
     { 
      var dbCommand = new SQLiteCommand(); 
      dbCommand.Connection = _dbConnection; 
      dbCommand.CommandText = "insert into Fisiere(Nume, Dimensiune, Data, Rating_imdb, Cale) values(@nume, @dimensiune, @data, @rating_imdb, @cale);"; 
      try { 
       _dbConnection.Open(); 
       dbCommand.Transaction = _dbConnection.BeginTransaction(); 
       for (int i = 0; i < directors.Length - 1; i++) 
       { 
        for (int j = 0; j < directors[i].nrFisiere; j++) 
        { 
         var numeParam = new SQLiteParameter("@nume"); 
         numeParam.Value = directors[i].fisiere[j].numeFisier; 
         var dimensiuneParam = new SQLiteParameter("@dimensiune"); 
         dimensiuneParam.Value = directors[i].fisiere[j].dimensiune; 
         var dataParam = new SQLiteParameter("@data"); 
         dataParam.Value = directors[i].fisiere[j].data; 
         var ratingParam = new SQLiteParameter("rating_imdb"); 
         IMDb rat = new IMDb(directors[i].fisiere[j].numeFisier); 
         ratingParam.Value = rat.Rating; 
         var caleParam = new SQLiteParameter("cale"); 
         caleParam.Value = directors[i].cale; 

         Console.WriteLine(numeParam.Value); 

         dbCommand.Parameters.Add(numeParam); 
         dbCommand.Parameters.Add(dimensiuneParam); 
         dbCommand.Parameters.Add(dataParam); 
         dbCommand.Parameters.Add(ratingParam); 
         dbCommand.Parameters.Add(caleParam); 



         Console.WriteLine(caleParam.Value); 


         dbCommand.Transaction.Commit(); 
         Console.WriteLine("A fost inserat"); 

        } 
       } 


      } 
      catch (Exception) 
      { 
       Console.WriteLine("muie"); 
       dbCommand.Transaction.Rollback(); 
       throw; 
      } 
      finally 
      { 
       if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close(); 

      } 
     } 

ロードファイル機能

public void LoadFiles() 
     { 
      const string stringSql = "PRAGMA database_list"; 
      try 
      { 
       _dbConnection.Open(); 
       SQLiteCommand sqlCommand = new SQLiteCommand(stringSql, _dbConnection); 
       SQLiteDataReader sqlReader = sqlCommand.ExecuteReader(); 
       try 
       { 
        while (sqlReader.Read()) 
        { 
         Console.WriteLine("se afiseaza"); 

         Console.WriteLine((long)sqlReader["Id_fisier"]); 
         Console.WriteLine((string)sqlReader["Nume"]); 
         Console.WriteLine((long)sqlReader["Dimensiune"]); 
         Console.WriteLine(DateTime.Parse((string)sqlReader["Data"])); 
         Console.WriteLine((long)sqlReader["Rating_imdb"]); 
         Console.WriteLine((string)sqlReader["Cale"]); 

        } 
       } 
       finally 
       { 
        // Always call Close when done reading. 
        sqlReader.Close(); 
       } 
      } 
      finally 
      { 
       if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close(); 
      } 
     } 

答えて

0

あなたのトランザクションをCommitする必要があるとしています。 BeginTransaction()に電話をしますが、データが決してDBに書き込まれないように決済を決してしません。トランザクションの詳細とワークフローについてはこちらをご覧ください。 https://www.sqlite.org/lang_transaction.html

もう1つの問題は、トランザクションとコマンドがすべて順不同であることです。トランザクション内でコマンドを実行し、トランザクションをコミットする必要があります。

public void addFisier(DirectorVideo[] directors) 
     { 
      SQLiteTransaction dbTrans; 

      try 
      { 
       _dbConnection.Open(); 

       // Start Transaction first. 
       dbTrans = _dbConnection.BeginTransaction(); 

       for (int i = 0; i < directors.Length - 1; i++) 
       { 
        for (int j = 0; j < directors[i].nrFisiere; j++) 
        { 
         // Create commands that run based on your number of inserts. 
         var dbCommand = new SQLiteCommand(); 
         dbCommand.Connection = _dbConnection; 
         dbCommand.CommandText = "insert into Fisiere(Nume, Dimensiune, Data, Rating_imdb, Cale) values(@nume, @dimensiune, @data, @rating_imdb, @cale);"; 
         dbCommand.Transaction = dbTrans; 

         var numeParam = new SQLiteParameter("@nume"); 
         numeParam.Value = directors[i].fisiere[j].numeFisier; 
         var dimensiuneParam = new SQLiteParameter("@dimensiune"); 
         dimensiuneParam.Value = directors[i].fisiere[j].dimensiune; 
         var dataParam = new SQLiteParameter("@data"); 
         dataParam.Value = directors[i].fisiere[j].data; 
         var ratingParam = new SQLiteParameter("rating_imdb"); 
         IMDb rat = new IMDb(directors[i].fisiere[j].numeFisier); 
         ratingParam.Value = rat; 
         var caleParam = new SQLiteParameter("cale"); 
         caleParam.Value = directors[i].cale; 

         Console.WriteLine(numeParam.Value); 

         dbCommand.Parameters.Add(numeParam); 
         dbCommand.Parameters.Add(dimensiuneParam); 
         dbCommand.Parameters.Add(dataParam); 
         dbCommand.Parameters.Add(ratingParam); 
         dbCommand.Parameters.Add(caleParam); 

         Console.WriteLine(caleParam.Value); 

         Console.WriteLine("A fost inserat"); 

         // Actually execute the commands. 
         dbCommand.ExecuteNonQuery(); 
        } 
       } 

       // If everything is good, commit the transaction. 
       dbTrans.Commit(); 
      } 
      catch (Exception) 
      { 
       Console.WriteLine("muie"); 
       dbTrans.Rollback(); 
       throw; 
      } 
      finally 
      { 
       if (_dbConnection.State != ConnectionState.Closed) _dbConnection.Close(); 

      } 
     } 

また、SQLiteTransactionクラスのドキュメントのスニペットもあります。私はそれを読むことをお勧めします:https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteTransaction.html

public static void RunSQLiteTransaction(string myConnString) { 
    using (SQLiteConnection sqConnection = new SQLiteConnection(myConnString)) { 
     sqConnection.Open(); 
     // Start a local transaction 
     SQLiteTransaction myTrans = sqConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 
     SQLiteCommand sqCommand = sqConnection.CreateCommand(); 
     try { 
      sqCommand.CommandText = "INSERT INTO Dept(DeptNo, DName) Values(52, 'DEVELOPMENT')"; 
      sqCommand.ExecuteNonQuery(); 
      sqCommand.CommandText = "INSERT INTO Dept(DeptNo, DName) Values(62, 'PRODUCTION')"; 
      sqCommand.ExecuteNonQuery(); 
      myTrans.Commit(); 
      Console.WriteLine("Both records are written to database."); 
     } 
     catch (Exception e) { 
      myTrans.Rollback(); 
      Console.WriteLine(e.ToString()); 
      Console.WriteLine("Neither record was written to database."); 
     } 
     finally { 
      sqCommand.Dispose(); 
      myTrans.Dispose(); 
     } 
    } 
} 
+0

私はコミットコマンドを入れましたが、結果は同じです。 –

+0

あなたのコードを変更して更新し、少なくともそれがどこにあるべきかを確認することができます。 – Mikanikal

+0

更新しました –

関連する問題