简体   繁体   中英

Using System.Data.SQLite.dll in C# Error in Data Fill: Cannot access a disposed object

I was trying to create a generalized C# code for database management. So far the code is working fine for MSSQL and MySQL. But when i try to use it for SQLite it throws error.

I figured out the problem but i am unable to change my framework at this moment. I raised a ticket at SQLite Site asking for help but i think those chicken heads deleted it without even sending a mail saying they won't do it. The UUID of the ticket is 2747b8a677ae2057a5617df1e20684256d6bbc93.

A test code is written in VS 2010 in C# with .Net 4 Framework to recreate the error. It's a windows form application the full project source is uploaded here .

The same code is listed below:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
using System.Data.SQLite;

namespace SQLite_Bug
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // We assume database already exist.
        // Need to replace **** with Appropriate values

        string ConStr_MSSQL = @"Persist Security Info=True;User ID=sa;Password=****;Initial Catalog=master;Data Source=****";
        string ConStr_MySQL = @"server=localhost;userid=root;password=****;database=****";
        string ConStr_SQLite = @"Data Source=E:\TestDB.sqllite;Version=3;FailIfMissing=true;Max Pool Size=100;Journal Mode=Off;";

        private void button1_Click(object sender, EventArgs e)
        {
            // MSSQL Test
            SqlConnection Con = new SqlConnection(ConStr_MSSQL);
            Con.Open();
            SqlCommand SC = Con.CreateCommand();
            SqlDataAdapter DA = new SqlDataAdapter();
            DataTable DT = new DataTable();

            SC.CommandTimeout = 0;
            SC.CommandType = CommandType.Text;
            SC.Connection = Con;
            SC.CommandText = "Select 'Test MSSQL Data'";

            DA.SelectCommand = SC;
            SC.Dispose();

            DA.Fill(DT);
            DA.Dispose();

            Con.Close();
            Con.Dispose();

            MessageBox.Show(DT.Rows[0][0].ToString());
            DT.Dispose();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // MySQL Test
            MySqlConnection Con = new MySqlConnection(ConStr_MySQL);
            Con.Open();
            MySqlCommand SC = Con.CreateCommand();
            MySqlDataAdapter DA = new MySqlDataAdapter();
            DataTable DT = new DataTable();

            SC.CommandTimeout = 0;
            SC.CommandType = CommandType.Text;
            SC.Connection = Con;
            SC.CommandText = "Select 'Test MySQL Data'";

            DA.SelectCommand = SC;
            SC.Dispose();

            DA.Fill(DT);
            DA.Dispose();

            Con.Close();
            Con.Dispose();

            MessageBox.Show(DT.Rows[0][0].ToString());
            DT.Dispose();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // SQLite Test
            //SQLiteConnection.CreateFile("E:\\TestDB.sqllite");
            SQLiteConnection Con = new SQLiteConnection(ConStr_SQLite);
            Con.Open(); // <-- Throw error almost every time. unable to open database file Error. Code 14.
            // 100% chance of getting this error if program crash before connection is closed.
            SQLiteCommand SC = Con.CreateCommand();
            SQLiteDataAdapter DA = new SQLiteDataAdapter();
            DataTable DT = new DataTable();

            SC.CommandTimeout = 0;
            SC.CommandType = CommandType.Text;
            SC.Connection = Con;
            SC.CommandText = "Select 'Test SQLite Data'";

            DA.SelectCommand = SC;
            SC.Dispose(); // I can't move it from here. :(

            DA.Fill(DT); // <-- Throw Error. Cannot access a disposed object. Object name: 'SQLiteCommand'.
            DA.Dispose();

            Con.Close();
            Con.Dispose();

            MessageBox.Show(DT.Rows[0][0].ToString());
            DT.Dispose();
        }
    }
}

Can you figure out why it happen just for SQLlite? I am sorry if there is any mistakes. And i having some network problem so i may not be able to replay right away :(

Thanks in advance :)

You're disposing the SelectCommand object before calling DA.Fill(DT), the DataAdapter object is going to need it. That's why you're getting the cannot access disposed object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM