我正在用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财产尚未初始化。“。
我想要实现的只是另一个类中的数据库连接,我可以调用它并且可以使用我的所有代码。
我是否应该以不同的方式调用数据库类?
答案 0 :(得分:13)
不,没有人在创建Program
的实例,也没有创建db
的实例。但是,我强烈建议你完全改变你的设计:
Program
类型 <{>} 答案 1 :(得分:6)
这肯定看起来不对,你的程序不应该继承或扩展你的数据库类。您的数据库类本身就是它自己的抽象数据类型。您的程序应使用数据库类,但不能扩展它。
我会稍微改变一下
DBClass.GetData();
那是你的程序应该使用数据库类作为黑盒子,它肯定不应该继承它。它应该使用它而不具备它如何工作的细节。在您的代码中:
// 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();
但要重申:接受他们的建议并重新开始。在许多情况下,这些玩具项目很快就会成长为全面的企业应用程序,一旦你到达那里,一开始就会犯错误。