Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. WinForm Database is locked SQLite

WinForm Database is locked SQLite

Scheduled Pinned Locked Moved C#
helpquestiondatabasesqliteannouncement
19 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    DPaul1994
    wrote on last edited by
    #1

    I want to update a column from table but I receive: `database is locked` twice. The error accours only when I call `updateIndex()` function. Why? This is the complete code: Load function:

    private void MediuInvatare_Load(object sender, EventArgs e)
    {
    using (Conexiune.getConnection())
    {
    string select = "SELECT * FROM questions WHERE id = indexrow LIMIT 1";
    using (SQLiteCommand cmd = new SQLiteCommand(select, Conexiune.getConnection()))
    {
    cmd.CommandType = CommandType.Text;
    using (SQLiteDataReader rdra = cmd.ExecuteReader(CommandBehavior.CloseConnection))
    {
    try
    {
    while (rdra.Read())
    {
    textBox1.Text = rdra["question"].ToString();
    idintrebare = Convert.ToInt32(rdra["id"]);
    }
    rdra.Close();
    }
    catch (InvalidOperationException ex)
    {
    MessageBox.Show(ex.Message);
    }
    }
    }
    }
    }

    Function where is the problem (I guess):

    private void updateIndex()
    {
    string update = "UPDATE questions SET indexrow='" + idintrebare + "' WHERE id='" + idintrebare + "'";
    SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection());
    comp.CommandType = CommandType.Text;
    comp.Parameters.AddWithValue(idintrebare.ToString(), idintrebare);
    SQLiteDataAdapter da = new SQLiteDataAdapter(comp);
    DataTable dt = new DataTable();
    da.Fill(dt);
    }

    Button where updateIndex() is called:

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    updateIndex();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }

    S S Richard DeemingR 3 Replies Last reply
    0
    • D DPaul1994

      I want to update a column from table but I receive: `database is locked` twice. The error accours only when I call `updateIndex()` function. Why? This is the complete code: Load function:

      private void MediuInvatare_Load(object sender, EventArgs e)
      {
      using (Conexiune.getConnection())
      {
      string select = "SELECT * FROM questions WHERE id = indexrow LIMIT 1";
      using (SQLiteCommand cmd = new SQLiteCommand(select, Conexiune.getConnection()))
      {
      cmd.CommandType = CommandType.Text;
      using (SQLiteDataReader rdra = cmd.ExecuteReader(CommandBehavior.CloseConnection))
      {
      try
      {
      while (rdra.Read())
      {
      textBox1.Text = rdra["question"].ToString();
      idintrebare = Convert.ToInt32(rdra["id"]);
      }
      rdra.Close();
      }
      catch (InvalidOperationException ex)
      {
      MessageBox.Show(ex.Message);
      }
      }
      }
      }
      }

      Function where is the problem (I guess):

      private void updateIndex()
      {
      string update = "UPDATE questions SET indexrow='" + idintrebare + "' WHERE id='" + idintrebare + "'";
      SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection());
      comp.CommandType = CommandType.Text;
      comp.Parameters.AddWithValue(idintrebare.ToString(), idintrebare);
      SQLiteDataAdapter da = new SQLiteDataAdapter(comp);
      DataTable dt = new DataTable();
      da.Fill(dt);
      }

      Button where updateIndex() is called:

      private void button1_Click(object sender, EventArgs e)
      {
      try
      {
      updateIndex();
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.Message);
      }
      }

      S Offline
      S Offline
      Simon_Whale
      wrote on last edited by
      #2

      From this link http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked[^] Are you able to tell if the code in the form load is still running when you click on the button?

      Every day, thousands of innocent plants are killed by vegetarians. Help end the violence EAT BACON

      1 Reply Last reply
      0
      • D DPaul1994

        I want to update a column from table but I receive: `database is locked` twice. The error accours only when I call `updateIndex()` function. Why? This is the complete code: Load function:

        private void MediuInvatare_Load(object sender, EventArgs e)
        {
        using (Conexiune.getConnection())
        {
        string select = "SELECT * FROM questions WHERE id = indexrow LIMIT 1";
        using (SQLiteCommand cmd = new SQLiteCommand(select, Conexiune.getConnection()))
        {
        cmd.CommandType = CommandType.Text;
        using (SQLiteDataReader rdra = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
        try
        {
        while (rdra.Read())
        {
        textBox1.Text = rdra["question"].ToString();
        idintrebare = Convert.ToInt32(rdra["id"]);
        }
        rdra.Close();
        }
        catch (InvalidOperationException ex)
        {
        MessageBox.Show(ex.Message);
        }
        }
        }
        }
        }

        Function where is the problem (I guess):

        private void updateIndex()
        {
        string update = "UPDATE questions SET indexrow='" + idintrebare + "' WHERE id='" + idintrebare + "'";
        SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection());
        comp.CommandType = CommandType.Text;
        comp.Parameters.AddWithValue(idintrebare.ToString(), idintrebare);
        SQLiteDataAdapter da = new SQLiteDataAdapter(comp);
        DataTable dt = new DataTable();
        da.Fill(dt);
        }

        Button where updateIndex() is called:

        private void button1_Click(object sender, EventArgs e)
        {
        try
        {
        updateIndex();
        }
        catch (Exception ex)
        {
        MessageBox.Show(ex.Message);
        }
        }

        S Offline
        S Offline
        Sascha Lefevre
        wrote on last edited by
        #3
        1. For Insert-, Update- and Delete-Statements you should use the ExecuteNonQuery()-method of the Command-object. 2) Though you initialized an Sql-Parameter and added it to the Command-object, you didn't adjust your Sql-Statement accordingly and you used the value of your variable idintrebare as the name for the parameter. 3) As CommandType.Text is the default, you don't have to explicitly set it. 4) Use disposable objects (the Connection and Command here) in a using-Block. See this Article: IDisposable: What Your Mother Never Told You About Resource Deallocation[^] 5) idintrebare appears to be a class-member. I would suggest you call updateIndex() with idintrebare as an argument instead. As I don't know the type of it, I'll use int here, please adjust that if neccessary. This should work:

        private void updateIndex(int id)
        {
        string update = "UPDATE questions SET indexrow=@idintrebare WHERE id=@idintrebare;";
        using (var connection = Conexiune.getConnection())
        using (SQLiteCommand cmd = new SQLiteCommand(update, connection))
        {
        connection.Open();
        cmd.Parameters.AddWithValue("@idintrebare", id);
        cmd.ExecuteNonQuery();
        }
        }

        If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

        D 1 Reply Last reply
        0
        • D DPaul1994

          I want to update a column from table but I receive: `database is locked` twice. The error accours only when I call `updateIndex()` function. Why? This is the complete code: Load function:

          private void MediuInvatare_Load(object sender, EventArgs e)
          {
          using (Conexiune.getConnection())
          {
          string select = "SELECT * FROM questions WHERE id = indexrow LIMIT 1";
          using (SQLiteCommand cmd = new SQLiteCommand(select, Conexiune.getConnection()))
          {
          cmd.CommandType = CommandType.Text;
          using (SQLiteDataReader rdra = cmd.ExecuteReader(CommandBehavior.CloseConnection))
          {
          try
          {
          while (rdra.Read())
          {
          textBox1.Text = rdra["question"].ToString();
          idintrebare = Convert.ToInt32(rdra["id"]);
          }
          rdra.Close();
          }
          catch (InvalidOperationException ex)
          {
          MessageBox.Show(ex.Message);
          }
          }
          }
          }
          }

          Function where is the problem (I guess):

          private void updateIndex()
          {
          string update = "UPDATE questions SET indexrow='" + idintrebare + "' WHERE id='" + idintrebare + "'";
          SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection());
          comp.CommandType = CommandType.Text;
          comp.Parameters.AddWithValue(idintrebare.ToString(), idintrebare);
          SQLiteDataAdapter da = new SQLiteDataAdapter(comp);
          DataTable dt = new DataTable();
          da.Fill(dt);
          }

          Button where updateIndex() is called:

          private void button1_Click(object sender, EventArgs e)
          {
          try
          {
          updateIndex();
          }
          catch (Exception ex)
          {
          MessageBox.Show(ex.Message);
          }
          }

          Richard DeemingR Offline
          Richard DeemingR Offline
          Richard Deeming
          wrote on last edited by
          #4

          Your code is vulnerable to SQL Injection[^]. NEVER use string concatenation to build a SQL query. ALWAYS use a parameterized query.

          private void updateIndex()
          {
          const string update = "UPDATE questions SET indexrow = @idintrebare WHERE id = @idintrebare";
          using (SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection()))
          {
          comp.CommandType = CommandType.Text;
          comp.Parameters.AddWithValue("@idintrebare", idintrebare);
          comp.ExecuteNonQuery();
          }
          }


          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

          "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

          D 1 Reply Last reply
          0
          • Richard DeemingR Richard Deeming

            Your code is vulnerable to SQL Injection[^]. NEVER use string concatenation to build a SQL query. ALWAYS use a parameterized query.

            private void updateIndex()
            {
            const string update = "UPDATE questions SET indexrow = @idintrebare WHERE id = @idintrebare";
            using (SQLiteCommand comp = new SQLiteCommand(update, Conexiune.getConnection()))
            {
            comp.CommandType = CommandType.Text;
            comp.Parameters.AddWithValue("@idintrebare", idintrebare);
            comp.ExecuteNonQuery();
            }
            }


            "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

            D Offline
            D Offline
            DPaul1994
            wrote on last edited by
            #5

            database is still locked

            1 Reply Last reply
            0
            • S Sascha Lefevre
              1. For Insert-, Update- and Delete-Statements you should use the ExecuteNonQuery()-method of the Command-object. 2) Though you initialized an Sql-Parameter and added it to the Command-object, you didn't adjust your Sql-Statement accordingly and you used the value of your variable idintrebare as the name for the parameter. 3) As CommandType.Text is the default, you don't have to explicitly set it. 4) Use disposable objects (the Connection and Command here) in a using-Block. See this Article: IDisposable: What Your Mother Never Told You About Resource Deallocation[^] 5) idintrebare appears to be a class-member. I would suggest you call updateIndex() with idintrebare as an argument instead. As I don't know the type of it, I'll use int here, please adjust that if neccessary. This should work:

              private void updateIndex(int id)
              {
              string update = "UPDATE questions SET indexrow=@idintrebare WHERE id=@idintrebare;";
              using (var connection = Conexiune.getConnection())
              using (SQLiteCommand cmd = new SQLiteCommand(update, connection))
              {
              connection.Open();
              cmd.Parameters.AddWithValue("@idintrebare", id);
              cmd.ExecuteNonQuery();
              }
              }

              If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

              D Offline
              D Offline
              DPaul1994
              wrote on last edited by
              #6

              First, thank you for suggestions. So: `Conexiune` is a class. `getConnection()` is a function that makes the connection and return true if connection is opened. So I can't use that `var connection`. I used this code in other forms and it worked..I want to update `indexrow` column with the value of int variable `idintrebare`..So I rewrite your code like this:

              string update = "UPDATE questions SET indexrow=@idintrebare WHERE id=@idintrebare;";
              using (var connection = Conexiune.getConnection())
              using (SQLiteCommand cmd = new SQLiteCommand(update, connection))
              {
              connection.Open();
              cmd.Parameters.AddWithValue("@idintrebare", idintrebare);
              cmd.ExecuteNonQuery();
              }

              ,but I receive `Operation is not valid due to the current state of the object`. `Conexiune` class looks like this: (This is good)

              private static string conn = @"Data Source=database.db;Pooling=true;FailIfMissing=false;Version=3;";
              public static SQLiteConnection connect = null;
              private Conexiune() { }
              public static SQLiteConnection getConnection()
              {
              SQLiteConnection connect = null;
              try
              {
              connect = new SQLiteConnection(conn);
              connect.Open();
              return connect;
              }
              catch (SQLiteException e)
              {
              throw new Exception("Cannot connect", e);
              }
              }

              S 1 Reply Last reply
              0
              • D DPaul1994

                First, thank you for suggestions. So: `Conexiune` is a class. `getConnection()` is a function that makes the connection and return true if connection is opened. So I can't use that `var connection`. I used this code in other forms and it worked..I want to update `indexrow` column with the value of int variable `idintrebare`..So I rewrite your code like this:

                string update = "UPDATE questions SET indexrow=@idintrebare WHERE id=@idintrebare;";
                using (var connection = Conexiune.getConnection())
                using (SQLiteCommand cmd = new SQLiteCommand(update, connection))
                {
                connection.Open();
                cmd.Parameters.AddWithValue("@idintrebare", idintrebare);
                cmd.ExecuteNonQuery();
                }

                ,but I receive `Operation is not valid due to the current state of the object`. `Conexiune` class looks like this: (This is good)

                private static string conn = @"Data Source=database.db;Pooling=true;FailIfMissing=false;Version=3;";
                public static SQLiteConnection connect = null;
                private Conexiune() { }
                public static SQLiteConnection getConnection()
                {
                SQLiteConnection connect = null;
                try
                {
                connect = new SQLiteConnection(conn);
                connect.Open();
                return connect;
                }
                catch (SQLiteException e)
                {
                throw new Exception("Cannot connect", e);
                }
                }

                S Offline
                S Offline
                Sascha Lefevre
                wrote on last edited by
                #7

                getConnection() returns an SQLiteConnection (not true/false). So you can use that using (var connection = Conexiune.getConnection()) -line. But as I see in that Conexiune-class, it already opens the connection for you. So the (new) error you're getting probably happens on my connection.Open() -line. Please remove that line and see what happens. As I've seen from your reply to Richard Deeming, who suggested almost the same new code as me, you still get the old error there. This makes me believe the cause is one of those listed on the page that Simon_Whale linked for you. Do you maybe have an open Select-query while you click on the button that calls updateIndex() ?

                If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                D 1 Reply Last reply
                0
                • S Sascha Lefevre

                  getConnection() returns an SQLiteConnection (not true/false). So you can use that using (var connection = Conexiune.getConnection()) -line. But as I see in that Conexiune-class, it already opens the connection for you. So the (new) error you're getting probably happens on my connection.Open() -line. Please remove that line and see what happens. As I've seen from your reply to Richard Deeming, who suggested almost the same new code as me, you still get the old error there. This makes me believe the cause is one of those listed on the page that Simon_Whale linked for you. Do you maybe have an open Select-query while you click on the button that calls updateIndex() ?

                  If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                  D Offline
                  D Offline
                  DPaul1994
                  wrote on last edited by
                  #8

                  I removed that line and now database is still locked. Well, I have another function which selects data from table and is called by pressing on another button, but even if I don't press that button and try to call `updateIndex()` just after form loads, I still got the error..

                  S 1 Reply Last reply
                  0
                  • D DPaul1994

                    I removed that line and now database is still locked. Well, I have another function which selects data from table and is called by pressing on another button, but even if I don't press that button and try to call `updateIndex()` just after form loads, I still got the error..

                    S Offline
                    S Offline
                    Sascha Lefevre
                    wrote on last edited by
                    #9

                    Do you possibly have some Select-query that is executed in your program's startup-code (so it get's executed no matter what) ? If yes, you might comment that out for testing. Maybe you don't close the reader of that query properly so that it's still open when trying to execute updateIndex().

                    If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                    D 1 Reply Last reply
                    0
                    • S Sascha Lefevre

                      Do you possibly have some Select-query that is executed in your program's startup-code (so it get's executed no matter what) ? If yes, you might comment that out for testing. Maybe you don't close the reader of that query properly so that it's still open when trying to execute updateIndex().

                      If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                      D Offline
                      D Offline
                      DPaul1994
                      wrote on last edited by
                      #10

                      I am sure..Where I have used DataReader, I used CommnadBehavior.CloseConnection and after that I closed the reader. For example:

                      string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                      using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, Conexiune.getConnection()))
                      {
                      using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                      {
                      if (read.Read())
                      {
                      SimulatorManager.Licenta = read["licenta"].ToString();
                      }
                      read.Close();
                      }
                      }

                      S 1 Reply Last reply
                      0
                      • D DPaul1994

                        I am sure..Where I have used DataReader, I used CommnadBehavior.CloseConnection and after that I closed the reader. For example:

                        string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                        using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, Conexiune.getConnection()))
                        {
                        using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                        {
                        if (read.Read())
                        {
                        SimulatorManager.Licenta = read["licenta"].ToString();
                        }
                        read.Close();
                        }
                        }

                        S Offline
                        S Offline
                        Sascha Lefevre
                        wrote on last edited by
                        #11

                        I don't think this is the issue but for good practice you should change this like so:

                        string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                        using (SQLiteConnection conn = Conexiune.getConnection())
                        using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, conn))
                        using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                        {
                        if (read.Read())
                        {
                        SimulatorManager.Licenta = read["licenta"].ToString();
                        }
                        // no need to explicitly close the reader when used in a using-block
                        }

                        ..and you also should use an Sql-Parameter here. Regarding the actual problem: I would suggest you double-check that all parts of your code where you run a select-query look like the above to ensure that the reader and connection get properly closed. For the purpose of testing you could execute an update-statement as the very first action in your program and see if that works.

                        If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                        D 3 Replies Last reply
                        0
                        • S Sascha Lefevre

                          I don't think this is the issue but for good practice you should change this like so:

                          string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                          using (SQLiteConnection conn = Conexiune.getConnection())
                          using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, conn))
                          using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                          {
                          if (read.Read())
                          {
                          SimulatorManager.Licenta = read["licenta"].ToString();
                          }
                          // no need to explicitly close the reader when used in a using-block
                          }

                          ..and you also should use an Sql-Parameter here. Regarding the actual problem: I would suggest you double-check that all parts of your code where you run a select-query look like the above to ensure that the reader and connection get properly closed. For the purpose of testing you could execute an update-statement as the very first action in your program and see if that works.

                          If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                          D Offline
                          D Offline
                          DPaul1994
                          wrote on last edited by
                          #12

                          Very good idea, I will try it right now!

                          1 Reply Last reply
                          0
                          • S Sascha Lefevre

                            I don't think this is the issue but for good practice you should change this like so:

                            string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                            using (SQLiteConnection conn = Conexiune.getConnection())
                            using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, conn))
                            using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                            {
                            if (read.Read())
                            {
                            SimulatorManager.Licenta = read["licenta"].ToString();
                            }
                            // no need to explicitly close the reader when used in a using-block
                            }

                            ..and you also should use an Sql-Parameter here. Regarding the actual problem: I would suggest you double-check that all parts of your code where you run a select-query look like the above to ensure that the reader and connection get properly closed. For the purpose of testing you could execute an update-statement as the very first action in your program and see if that works.

                            If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                            D Offline
                            D Offline
                            DPaul1994
                            wrote on last edited by
                            #13

                            I tried to run the update on form loading and I get the error. It means that the error can be from the form that opens this form? Because I checked there and I have used `using` for everything and is ok..

                            S 1 Reply Last reply
                            0
                            • S Sascha Lefevre

                              I don't think this is the issue but for good practice you should change this like so:

                              string selectareLicenta = "SELECT licenta FROM licente WHERE licenta = '" + maskedTextBox1.Text + "'";
                              using (SQLiteConnection conn = Conexiune.getConnection())
                              using (SQLiteCommand cmd = new SQLiteCommand(selectareLicenta, conn))
                              using (SQLiteDataReader read = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                              {
                              if (read.Read())
                              {
                              SimulatorManager.Licenta = read["licenta"].ToString();
                              }
                              // no need to explicitly close the reader when used in a using-block
                              }

                              ..and you also should use an Sql-Parameter here. Regarding the actual problem: I would suggest you double-check that all parts of your code where you run a select-query look like the above to ensure that the reader and connection get properly closed. For the purpose of testing you could execute an update-statement as the very first action in your program and see if that works.

                              If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                              D Offline
                              D Offline
                              DPaul1994
                              wrote on last edited by
                              #14

                              It's ok, I have found the error! In class `cs` where I have `static void Main()`, this is the main class of the project, I have this code:

                              string selectutilizator = "SELECT * FROM accounts";
                              using (SQLiteCommand selcom = new SQLiteCommand(selectutilizator, Conexiune.getConnection()))
                              {
                              using (SQLiteDataReader read = selcom.ExecuteReader())
                              {
                              if (read.HasRows)
                              {
                              Application.Run(new Elev());
                              }
                              else Application.Run(new Intro());
                              }
                              }

                              But I need this for the program..what is wrong there?

                              S 1 Reply Last reply
                              0
                              • D DPaul1994

                                I tried to run the update on form loading and I get the error. It means that the error can be from the form that opens this form? Because I checked there and I have used `using` for everything and is ok..

                                S Offline
                                S Offline
                                Sascha Lefevre
                                wrote on last edited by
                                #15

                                Hmm. And there's nothing database-related happening before that in your code? Could probably another program be running and accessing the same database? Maybe there's some "zombie"-process of your program still running and keeping a connection to the database alive. See if rebooting Windows solves the issue.

                                If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                                D 1 Reply Last reply
                                0
                                • S Sascha Lefevre

                                  Hmm. And there's nothing database-related happening before that in your code? Could probably another program be running and accessing the same database? Maybe there's some "zombie"-process of your program still running and keeping a connection to the database alive. See if rebooting Windows solves the issue.

                                  If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                                  D Offline
                                  D Offline
                                  DPaul1994
                                  wrote on last edited by
                                  #16

                                  See my last reply

                                  1 Reply Last reply
                                  0
                                  • D DPaul1994

                                    It's ok, I have found the error! In class `cs` where I have `static void Main()`, this is the main class of the project, I have this code:

                                    string selectutilizator = "SELECT * FROM accounts";
                                    using (SQLiteCommand selcom = new SQLiteCommand(selectutilizator, Conexiune.getConnection()))
                                    {
                                    using (SQLiteDataReader read = selcom.ExecuteReader())
                                    {
                                    if (read.HasRows)
                                    {
                                    Application.Run(new Elev());
                                    }
                                    else Application.Run(new Intro());
                                    }
                                    }

                                    But I need this for the program..what is wrong there?

                                    S Offline
                                    S Offline
                                    Sascha Lefevre
                                    wrote on last edited by
                                    #17

                                    Yep, that's the problem, most certainly. Application.Run(..) is a blocking call, so the DataReader is alive all the time. Just declare a boolean variable hasRows at the top of this code, assign read.HasRows to it after ExecuteReader(), move the if-else out of the using-blocks and use the boolean variable there instead of the reader.

                                    If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                                    D 1 Reply Last reply
                                    0
                                    • S Sascha Lefevre

                                      Yep, that's the problem, most certainly. Application.Run(..) is a blocking call, so the DataReader is alive all the time. Just declare a boolean variable hasRows at the top of this code, assign read.HasRows to it after ExecuteReader(), move the if-else out of the using-blocks and use the boolean variable there instead of the reader.

                                      If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                                      D Offline
                                      D Offline
                                      DPaul1994
                                      wrote on last edited by
                                      #18

                                      Yes, you right. Thank you very much! This is the solution:

                                      string selectutilizator = "SELECT * FROM accounts";
                                      bool hasrows=false;
                                      using (SQLiteCommand selcom = new SQLiteCommand(selectutilizator, Conexiune.getConnection()))
                                      {
                                      using (SQLiteDataReader read = selcom.ExecuteReader())
                                      {
                                      if (read.HasRows)
                                      {
                                      hasrows=true;
                                      }
                                      }
                                      }
                                      if (hasrows) Application.Run(new Elev());
                                      else Application.Run(new Intro());

                                      S 1 Reply Last reply
                                      0
                                      • D DPaul1994

                                        Yes, you right. Thank you very much! This is the solution:

                                        string selectutilizator = "SELECT * FROM accounts";
                                        bool hasrows=false;
                                        using (SQLiteCommand selcom = new SQLiteCommand(selectutilizator, Conexiune.getConnection()))
                                        {
                                        using (SQLiteDataReader read = selcom.ExecuteReader())
                                        {
                                        if (read.HasRows)
                                        {
                                        hasrows=true;
                                        }
                                        }
                                        }
                                        if (hasrows) Application.Run(new Elev());
                                        else Application.Run(new Intro());

                                        S Offline
                                        S Offline
                                        Sascha Lefevre
                                        wrote on last edited by
                                        #19

                                        DPaul1994 wrote:

                                        Yes, you right. Thank you very much!

                                        You're welcome! :)

                                        If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson

                                        1 Reply Last reply
                                        0
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes


                                        • Login

                                        • Don't have an account? Register

                                        • Login or register to search.
                                        • First post
                                          Last post
                                        0
                                        • Categories
                                        • Recent
                                        • Tags
                                        • Popular
                                        • World
                                        • Users
                                        • Groups