C#SQLite数据库已锁定
我已经尝试了所有我能找到的解决这个问题的方法,但是由于某种原因,我仍然得到一个异常,说明我正在使用的数据库被锁定。 我的代码如下:C#SQLite数据库已锁定,c#,visual-studio,sqlite,C#,Visual Studio,Sqlite,我已经尝试了所有我能找到的解决这个问题的方法,但是由于某种原因,我仍然得到一个异常,说明我正在使用的数据库被锁定。 我的代码如下: string connectionString = "Data Source=D:\\CCIW\\LCM\\Organisational Database\\OrganisationalDB;" + "MultipleActiveResultSets=True"; using (SQLiteConnection Ori
string connectionString = "Data Source=D:\\CCIW\\LCM\\Organisational Database\\OrganisationalDB;" +
"MultipleActiveResultSets=True";
using (SQLiteConnection OriginatorDBConnection = new SQLiteConnection(connectionString))
{
string originatorName, originatorOrganisation, originatorAddress, originatorCellNumber, originatorTelNumber, originatorEmail;
originatorName = originatorNameTextBox.Text;
originatorOrganisation = originatorOrganisationTextBox.Text;
originatorAddress = originatorAddressRichTextBox.Text;
originatorCellNumber = originatorCellTextBox.Text;
originatorTelNumber = originatorTelTextBox.Text;
originatorEmail = originatorEmailTextBox.Text;
OriginatorDBConnection.Open();
string originatorINSERT = "INSERT INTO Originator (Name, Organisation, Address, CellphoneNumber, TelephoneNumber, Email) VALUES ('" + originatorName + "', '" + originatorOrganisation + "', '" + originatorAddress + "', '" + originatorCellNumber + "', '" + originatorTelNumber + "', '" + originatorEmail + "');";
using (SQLiteCommand originatorCommand = new SQLiteCommand(originatorINSERT, OriginatorDBConnection))
{
originatorCommand.ExecuteNonQuery();
}
OriginatorDBConnection.Close();
}
在这里,我能找到的最接近问题的解决方案是:
然而,它似乎对我的问题不起作用。
我做错了什么
我有一个额外的功能,其中我使用连接:
public AdminForm()
{
//Initialise AdminForm components.
InitializeComponent();
//Establish and open connection to ObservationDB.
string connectionString = "Data Source=D:\\CCIW\\LCM\\Organisational Database\\OrganisationalDB;" +
"MultipleActiveResultSets=True";
ObservationDBConnection = new SQLiteConnection(connectionString);
ObservationDBConnection.Open();
//Query database to find all originators
string originatorSELECT = "SELECT * FROM Originator;";
string ECPNumberSELECT = "SELECT * FROM ECP";
SQLiteCommand command = new SQLiteCommand(originatorSELECT, ObservationDBConnection);
SQLiteDataReader reader = command.ExecuteReader();
SQLiteCommand command2 = new SQLiteCommand(ECPNumberSELECT, ObservationDBConnection);
SQLiteDataReader reader2 = command2.ExecuteReader();
//Populate OriginatorName combobox with names of existing originators.
List<string> originatorNames = new List<string>();
while (reader.Read())
{
originatorNames.Add(Convert.ToString(reader["Name"]));
}
OriginatorNameComboBox.DataSource = originatorNames;
//Populate ECP combobox with numbers of existing ECP.
List<string> ECPNumbers = new List<string>();
while (reader2.Read())
{
ECPNumbers.Add(Convert.ToString(reader2["Number"]));
}
ECPNumComboBox.DataSource = ECPNumbers;
//Populate TC Decision combobox with options.
List<string> TCDecision = new List<string>();
TCDecision.Add("Rework");
TCDecision.Add("Reject");
TCDecision.Add("Approve");
TCDecisionComboBox.DataSource = TCDecision;
ObservationDBConnection.Close();
}
我知道我在游戏中迟到了很多,但看起来你并没有在AdminForm()构造函数中关闭你的阅读器变量。考虑使用一个USER(./P>< P>环绕命令)和DeadReader来包装DATaReader:
using (SqliteCommand cmd = new SqliteCommand(sQuery, m_Conn))
{
using (SqliteDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
ret_type = reader.GetInt32(0);
}
}
}
你确定你的代码中没有其他地方打开它,或者没有其他进程使用itI吗?我在使用它的地方有一个单独的函数(尽管代码很长)。但我确保在它执行后关闭连接。这是两个不相交的函数,因此一个可以在另一个之前调用-不确定这是否有区别。我是否应该发布其他代码的相关内容?问题是其他连接或程序仍有活动事务,因此此代码所做的并不真正相关。其他代码可能相关,但正如我和@CL所说,它更可能是其其他代码。尽管由于某种原因,您的代码在这里导致异常,但您可能会发现关闭没有被执行..请参数化您的SQL-这对于SQL注入来说是绝对成熟的,因为您正在从用户那里获取输入-想象一下如果他们输入';DROP TABLE Originator-这可以允许用户删除您的表
using (SqliteCommand cmd = new SqliteCommand(sQuery, m_Conn))
{
using (SqliteDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
ret_type = reader.GetInt32(0);
}
}
}