调用类来进行数据库连接

时间:2011-10-19 16:24:11

标签: c# database class ms-access

我正在用C#编程。我正在尝试创建一个类,在调用时将创建与数据库的连接。

我的数据库连接类在这里:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace HouseServer
{

    class db
    {

        // Variable to hold the driver and location of database
        public static OleDbConnection dbConnection;

        // Database connection
        public db()
        {

            // Define the Access Database driver and the filename of the database
            dbConnection = new OleDbConnection("Provider=Microsoft.Ace.OLEDB.12.0; Persist Security Info = False; Data Source=Houses.accdb");

            // Open the connection
            dbConnection.Open();
        }
    }
}

主程序在这里:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace HouseServer
{
    class Program : db
    {

        // List for holding loaded houses
        static List<house> houses = new List<house>();

        // Variable to hold "command" which is the query to be executed
        private static OleDbCommand query;

        // Variable to hold the data reader to manipulate data from the database
        static OleDbDataReader dataReader;

        static void Main(string[] args)
        {
            // Get the houses in a list
            List<house> c = getHousesFromDb();

            foreach (house yay in c)
            {
                // Show each house's full address
                Console.WriteLine(yay.house_number + " " + yay.street);
                Console.WriteLine(yay.house_town);
                Console.WriteLine(yay.postcode);
            }

            // Readline to prevent window from closing
            Console.ReadLine();
        }

        // Function which loads all of the houses from the database
        private static List<house> getHousesFromDb()
        {

            // Define the query to be executed
            query = new OleDbCommand("SELECT * FROM houses", dbConnection);

            // Execute the query on the database and get the data
            dataReader = query.ExecuteReader();

            // Loop through each of the houses
            while (dataReader.Read())
            {
                // Create a new house object for temporarily storing house
                house house = new house();

                // Create the house that we've just loaded
                house.house_id = Convert.ToInt32(dataReader["house_id"]);
                house.house_number = Convert.ToInt32(dataReader["house_number"]);
                house.street = dataReader["house_street"].ToString();
                house.house_town = dataReader["house_town"].ToString();
                house.postcode = dataReader["house_postcode"].ToString();

                // Now add the house to the list of houses
                houses.Add(house);
            }

            // Return all of the houses in the database as a List<house>
            return houses;
        }
    }
}

我认为在程序打开时将class Program : db调用db构造函数,但是当代码到达行dataReader = query.ExecuteReader();时,它会出现错误“ExecuteReader:Connection财产尚未初始化。“。

我想要实现的只是另一个类中的数据库连接,我可以调用它并且可以使用我的所有代码。

我是否应该以不同的方式调用数据库类?

3 个答案:

答案 0 :(得分:13)

不,没有人在创建Program的实例,也没有创建db的实例。但是,我强烈建议你完全改变你的设计:

  • 您的数据库连接没有静态字段。在需要时打开它,使用它,关闭它。您应该很少将其存储在局部变量以外的任何其他位置。
  • 如果可以提供帮助,请尽量不要使用静态变量。它们使您的代码更难以测试,因为它们代表全局状态 - 这比本地状态更难以推理。在你的程序中,我将完全使用局部变量。
  • 不要将继承用于此类事件 - 您的Program类型 <{>}
  • 遵循方法,类和属性的.NET命名约定。让你的代码“感觉”像惯用语C#将有助于让其他人更具可读性。

答案 1 :(得分:6)

这肯定看起来不对,你的程序不应该继承或扩展你的数据库类。您的数据库类本身就是它自己的抽象数据类型。您的程序应使用数据库类,但不能扩展它。

我会稍微改变一下

  1. 摆脱继承
  2. 使数据库类成为静态类(没有理由在此实例化数据库实例)
  3. 您的程序可以DBClass.GetData();
  4. 那是你的程序应该使用数据库类作为黑盒子,它肯定不应该继承它。它应该使用它而不具备它如何工作的细节。在您的代码中:

    // List for holding loaded houses
    static List<house> houses = new List<house>();
    
    // Variable to hold "command" which is the query to be executed
    private static OleDbCommand query;
    
    // Variable to hold the data reader to manipulate data from the database
    static OleDbDataReader dataReader;
    
    static void Main(string[] args)
    {
        // Get the houses in a list
        List<house> c = getHousesFromDb();
    

    您应该隐藏OleDbCommand和OleDbDatareader对象的详细信息,尽管不需要它们可以在其他地方进行管理。您的getHousesFromDB应该被称为:

    MyDBClass.GetHousesFromDB()

    其中MyDBClass是一个管理数据库读/写的静态类。 GetHousesFromDB的签名应该返回IList<House> GetHousesFromDB()

    的效果

答案 2 :(得分:4)

虽然Jon Skeet&amp; JonH提出有效的观点,我会回答为什么你会得到例外。从那里你应该听从他们的建议并从头开始重做。

你得到异常的原因是它在db的构造函数中被初始化,它永远不会被调用。

如果您将此行添加到Main,您的程序应该有效。

new Program();

但要重申:接受他们的建议并重新开始。在许多情况下,这些玩具项目很快就会成长为全面的企业应用程序,一旦你到达那里,一开始就会犯错误。