WinForm Database is locked SQLite
-
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
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();
}
} -
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();
}
}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
-
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
-
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
-
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
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?
-
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..
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
-
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
-
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?
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, assignread.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
-
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, assignread.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
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()); -
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());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