c#数据库连接类

时间:2018-04-25 22:38:32

标签: c# wpf exception-handling objectdisposedexception

我是C#的新手,我正在编写一个需要连接sqlite数据库的c#应用程序。我认为创建自己的DBConnection课程对我来说最简单,我在下面给出了这个课程。我目前遇到的主要问题是析构函数。有时当我实例化这个类并且它超出范围时,我会得到一个

  

System.ObjectDisposedException; '无法访问已处置的对象。   对象名称:' SQLiteConnection'。'

现在我已经搜索了这意味着什么的定义,但我并不理解。

该对象正在作为wpf应用程序窗口的一部分进行实例化,并且一旦窗口x出来,并且在数据库操作完成后抛出此异常。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Data.SQLite;
using System.IO;

namespace PhotoSuppliesInc
{
    //this class will be used for connecting to the database in the various forms
    public class DBConnector
    {
        //----------------------------------PRIVATES------------------------------//
        //this is the connection to the db
        private SQLiteConnection dbConnection;

        //-------------------CONSTRUCTOR(S) and DESCTRUCTOR----------------//
        public DBConnector()
        {
                string connectionString = "Data Source=C:\\Users\\dmand\\source\\repos\\PhotoSuppliesInc\\PhotoSuppliesInc\\database\\riverfrontphoto.db;" +
                                            "Version = 3; FailIfMissing=True; Foreign Keys=True;";
                try
                {
                    dbConnection = new SQLiteConnection(connectionString);
                    dbConnection.Open();
                    MessageBox.Show("Database connected successfully");
                }//end try
                catch (SQLiteException e) { MessageBox.Show("error opening database"); }
        }//end constructor
        //destructor removes connection to database
        ~DBConnector()
        {
                dbConnection.Close();
        }
        //--------------------------------------------------GETTER(S)------------------------//
        //public string Get_Filepath() { return filepath; }

        //--------------------------------------------------UTILITY FUNCTIONS----------------//
        public List<string> Select_Query(string query_string, string columns)
        {
            //the names of the columns in the select statement
            string[] selection_columns = columns.Split();
            //each member of the array is the tuple, the data is separated by spaces
            List<string> result = new List<string>();
            //this string constructs the result line to be inserted into the result list
            string tempstring;
            SQLiteCommand command = new SQLiteCommand(query_string, dbConnection);
            SQLiteDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                tempstring = "";//reset the temp string for each tuple
                int i = 0;
                foreach(string s in selection_columns)
                {
                    tempstring += reader[s] + " ";
                    i++;
                }
                //I'm not sure why result.add must go here, but it does
                result.Add(tempstring);
            }
            //the result is a list who's contents are strings that represent each tuple
            return result;
        }
    }//end class
}//end namespace

///////in LoginWindow.xaml.cs////

这是我如何在窗口代码文件中使用该类。 ...

 public LoginWindow()
        {
            InitializeComponent();

            //testing the DBConnector class:
            DBConnector riverfront = new DBConnector();
            string output_string = "";
            foreach (string s in riverfront.Select_Query(@"select distinct fname || ' ' || lname as 'Full_Name', country from employee, employee_account limit 5", "Full_Name country"))
                output_string += s + "\n";
            MessageBox.Show(output_string);
        }

...

正如我所说,我不知道这个错误意味着什么,或者我是否正确使用了这种语言的析构函数。在我看来,这里应该没有问题。有人可以帮我弄清楚这个错误在我班上意味着什么吗? 谢谢大家的时间。

1 个答案:

答案 0 :(得分:1)

您没有正确使用“析构函数”,因为C#没有析构函数,它有终结器

执行您要执行的操作的正确方法是在using块中实现IDisposable pattern并访问您的类的实例。

终结器(由〜语法表​​示)是非确定性的 - 您无法控制垃圾收集器何时运行终结器,或者它是否曾经如此。实现IDisposable并访问使用块中的实例允许您实现确定性的资源清理。

这就是为什么你得到一个ObjectDisposedException:你的班级终结者在你的SQLiteConnection实例被处理后正在运行