簡體   English   中英

C#SQLite數據庫已鎖定

[英]C# SQLite database locked

我已經嘗試了所有可以找到的解決方案,但是由於某種原因,我仍然遇到異常,說明正在使用的數據庫已鎖定。 我的代碼如下:

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

我可以找到的最接近問題的解決方案是: SQLite數據庫鎖定異常

但是,它似乎不適用於我的問題。 我究竟做錯了什么?

我還有一個使用連接的附加功能:

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

和這里:

private void SaveButton_Click(object sender, EventArgs e)
    {
        ObservationDBConnection.Open();

        ...

        string ImpactTypeINSERT = "INSERT INTO ImpactType (ImpactType, Description) VALUES ('" + impactType + "', '" + impactDescription + "');";
        SQLiteCommand ImpactTypeCommand = new SQLiteCommand(ImpactTypeINSERT, ObservationDBConnection);
        //SQLiteDataReader ImpactTypeReader = ImpactTypeCommand.ExecuteReader();
        ImpactTypeCommand.ExecuteNonQuery();

        ...

        string TCDecisionINSERT = "INSERT INTO TCDecision (Decision, Description) VALUES ('" + TechnicalCommitteeDecision + "', '" + TechnicalCommitteeDescription + "');";
        SQLiteCommand TCDecisionCommand = new SQLiteCommand(TCDecisionINSERT, ObservationDBConnection);
        SQLiteDataReader TCDecisionReader = ImpactTypeCommand.ExecuteReader();
        TCDecisionCommand.ExecuteNonQuery();

        ...

        string OperationalDecisionINSERT = "INSERT INTO OperationalDecision (Decision, Description) VALUES ('" + operationalDecision + "', '" + operationalDescription + "');";
        SQLiteCommand OperationalDecisionCommand = new SQLiteCommand(OperationalDecisionINSERT, ObservationDBConnection);
        //SQLiteDataReader OperationalDecisionReader = OperationalDecisionCommand.ExecuteReader();
        OperationalDecisionCommand.ExecuteNonQuery();

        ...

        ...

            string OriginatorIDSELECT = "SELECT * FROM Originator WHERE Name='" + OriginatorNameComboBox.Text + "';";
            SQLiteCommand OriginatorIDCommand = new SQLiteCommand(OriginatorIDSELECT, ObservationDBConnection);
            SQLiteDataReader OriginatorIDReader = OriginatorIDCommand.ExecuteReader();
            originatorIDOBS = OriginatorIDReader.GetOrdinal("ID");
            //ImpactType
            string impactTypeSELECT = "SELECT * FROM ImpactType WHERE ImpactType='" + impactType + "';";
            SQLiteCommand impactTypeOBSCommand = new SQLiteCommand(impactTypeSELECT, ObservationDBConnection);
            SQLiteDataReader impactTypeOBSReader = impactTypeOBSCommand.ExecuteReader();
            impactTypeOBS = impactTypeOBSReader.GetOrdinal("ID");            

            string operationalDecisionOBSSELECT = "SELECT * FROM OperationalDecision WHERE Decision='" + operationalDecision + "';";
            SQLiteCommand operationalDecisionOBSCommand = new SQLiteCommand(operationalDecisionOBSSELECT, ObservationDBConnection);
            SQLiteDataReader operationalDecisionOBSReader = operationalDecisionOBSCommand.ExecuteReader();
            operationalDecisionOBS = operationalDecisionOBSReader.GetOrdinal("ID");

           ...

            string ECPOBSSELECT = "SELECT * FROM ECP WHERE Number='" + ECPNumComboBox.Text + "';";
            SQLiteCommand ECPCommand = new SQLiteCommand(ECPOBSSELECT, ObservationDBConnection);
            SQLiteDataReader ECPReader = ECPCommand.ExecuteReader();
            ECPOBS = ECPReader.GetOrdinal("ID");


            string CNISObservationINSERT = "INSERT INTO CNISObservation (Title, ReceiveDate, TableDate, OriginatorID, OriginatorReference, OriginatorDate, ObservationNumber, RevisionNumber, Description, Status, ImpactDescription, ImpactType, OperationalRequirementDescription, OperationalImpact, OperationalDecision, ProposedAction, TCDecision, ECP, SolutionOperationalImpact, TechnicalSolutionImpact) VALUES ('" + 
                                                                        titleOBS + "','" 
                                                                        + receiveDateOBS + "','" 
                                                                        + tableDateOBS + "','"
                                                                        + originatorIDOBS + ",'"
                                                                        + originatorReferenceOBS +"','"
                                                                        + originatorDateOBS + "','"
                                                                        + observationNumberOBS + "',"
                                                                        + revisionNumberOBS + ",'"
                                                                        + descriptionOBS + "',"
                                                                        + statusOBS + ",'"
                                                                        + impactDescriptionOBS + "',"
                                                                        + impactTypeOBS + ",'"
                                                                        + operationalRequirementDescriptionOBS + "','"
                                                                        + operationalImpactOBS + "',"
                                                                        + operationalDecisionOBS + ",'"
                                                                        + TCDecisionOBS + ","
                                                                        + ECPOBS + ",'"
                                                                        + solutionOperationalImpactOBS + "','"
                                                                        + technicalSolutionImpactOBS + "');"; 

        ...

        string obsOBSSELECT = "SELECT * FROM CNISObservation ORDER BY ID DESC LIMIT 1;";
        SQLiteCommand CNISObservationIDCommand = new SQLiteCommand(obsOBSSELECT, ObservationDBConnection);
        SQLiteDataReader CNISObservationIDReader = CNISObservationIDCommand.ExecuteReader();
        observationID = CNISObservationIDReader.GetOrdinal("ID");

        ...

        foreach (var capabilityID in capabilitiesSelected)
        {
            string ObservationOperationalCapabilitiesINSERT = "INSERT INTO ObservationOperationalCapabilities (CapabilityID, ObservationID) VALUES (" + capabilityID + "," + observationID + ");";
            SQLiteCommand ObservationOperationalCapabilitiesCommand = new SQLiteCommand(ObservationOperationalCapabilitiesINSERT, ObservationDBConnection);
            // SQLiteDataReader ObservationOperationalCapabilitiesReader = ObservationOperationalCapabilitiesCommand.ExecuteReader();
            ObservationOperationalCapabilitiesCommand.ExecuteNonQuery();

        }

        ...

        string CNISObservationIDSELECT = "SELECT * FROM CNISObservation ORDER BY ID DESC LIMIT 1;";
        SQLiteCommand CNISObservationCommand = new SQLiteCommand(CNISObservationIDSELECT, ObservationDBConnection);
        SQLiteDataReader CNISObservationReader = CNISObservationCommand.ExecuteReader();
        CNISObservationID = CNISObservationReader.GetOrdinal("ID");

        string CNISReleaseINSERT = "INSERT INTO CNISSection VALUES (" + CNISObservationID + "," + CNISRelease + "," + chapter + ",'" + paragraph + "','" + section + "','" + page +"');";
        SQLiteCommand CNISReleaseCommand = new SQLiteCommand(CNISReleaseINSERT, ObservationDBConnection);
        //SQLiteDataReader CNISReleaseReader = CNISReleaseCommand.ExecuteReader();
        CNISReleaseCommand.ExecuteNonQuery();

        ObservationDBConnection.Close();
    }

我知道我比賽還很晚,但是看來您沒有在AdminForm()構造函數中關閉讀者變量。 考慮將DataReaders包裝在using()中。

圍繞Command和Reader確實為我工作:

using (SqliteCommand cmd = new SqliteCommand(sQuery, m_Conn))
{
    using (SqliteDataReader reader = cmd.ExecuteReader())
    {
        if (reader.Read())
        {
            ret_type = reader.GetInt32(0);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM