【发布时间】:2017-10-11 18:54:04
【问题描述】:
我是一个苦苦挣扎的新手,试图学习和了解这种新的 C# 语言和 OO 风格,我的大脑不像 20 年前那么敏锐。 这里我们有一个到 Access (.accdb) 的简单数据库连接 我正在实例化一个辅助类,它包含两个方法,即 makeconn 和 readfrondb 方法,如下所示
public void Form1_Load(object sender, EventArgs e) {
Clshelper chelp = new Clshelper();
chelp.makeconn();
chelp.readfromdb();
}
这是下面的辅助类 - 创建是因为我想保留连接部分以及我在单独的方法中执行的任何类型的数据操作。 但是,除非在方法 makeconn 中创建连接对象 con1 的行抛出异常,因为 con1 是 NULL 对象,如果我将其编码如下。
public class Clshelper {
public OleDbConnection con1;
public OleDbCommand cmd;
public Clshelper() {
Console.WriteLine("instantiated Cls_helper()");
}
public void makeconn() {
OleDbConnection con1 = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = D:\\DATA.accdb");
}
public void readfromdb() {
con1.Open();
(...)
}
但是,如果我将 makeconn 中创建 con1 连接对象的行放入 readfromdb 的顶部,并且只运行 readfromdb 一切正常。 那么为什么 readfromdb 方法不能“看到”我在 makeconn 方法中创建的 con1 对象 - 我认为一个类中的任何变量对同一个类中的所有方法都是可见的?
【问题讨论】:
-
只需将
OleDbConnection con1 = new OleDbConnection(...)更改为this.con1 = new OleDbConnection(...)即可访问预期的属性。 -
考虑使用一些命名约定来帮助您识别成员变量,例如
m_Con1或_con1(实际上是基于使用什么约定的意见,但我建议使用不同于“简单名称”的名称" 用于局部变量/函数参数) -
您不应将数据库连接存储在字段(类级别变量)中。 ADO.NET 连接(如 OleDbConnection)实现 IDisposable 它们应该在 using 块中创建。
-
@mason,对于像
Clshelper这样的连接助手,将连接存储在成员变量中(并让类本身实现 IDisposable)可能是个好主意。我认为 .NetOleDbConnection类的功能完全相同 -
@Gian Paolo(和其他人)会像我的助手这样的类在后台自动实现 iDisposable 还是我必须手动对其进行编码 - 基于标准,“使用”方法会更好吗?
标签: c# scope visibility public