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);
        }
    }
}