如果您只是为一个查询手动设置数据库连接,那么实际上没有更简单的方法可以做到这一点。不过,我建议对代码进行一些清理。正如您的示例中所写,MyConn
如果您的查询期间出现错误,它将保持打开状态。这可以通过将其切换并将其放入来修复using
:
public void setSQL()
{
string ConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jasper\Desktop\AutoReg\AutoReg.accdb;";
DataSet ds = new DataSet();
//query to ask
string query = "SELECT * FROM Student";
using (OleDbConnection MyConn = new OleDbConnection(ConnStr))
{
MyConn.Open();
using (OleDbCommand command = new OleDbCommand(query, MyConn))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
adapter.Fill(ds);
}
}
}
dataGridView1.DataSource = ds;
}
但是,如果您想切换它并让您在将来需要添加更多查询时更轻松,那么我建议您迁移到具有业务逻辑层 (BLL) 和数据访问的3 层架构层 (DAL)。在这种情况下,您可以有一个基本 DAL 类,它为诸如Fill()
、 ExecuteScalar()
、ExecuteNonQuery()
等定义一些标准方法。
您可以在互联网上找到无数此类设置的示例,但我整理了一个相当简单的示例:
这是一个可能的 DAL 基类的粗略草图。请注意它如何根据传入的 DB 命令管理与数据库的实际连接:
public abstract class DALBase
{
private const string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jasper\Desktop\AutoReg\AutoReg.accdb;";
protected DataSet Fill(OleDbCommand command)
{
DataSet ds = new DataSet();
using (OleDbConnection myConn = new OleDbConnection(connStr))
{
command.Connection = myConn;
myConn.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
adapter.Fill(ds);
}
}
return ds;
}
protected void ExecuteNonQuery(OleDbCommand command)
{
using (OleDbConnection myConn = new OleDbConnection(connStr))
{
command.Connection = myConn;
myConn.Open();
command.ExecuteNonQuery();
}
}
// put any other methods you need here
}
然后你可以为你的学生表创建一个特定于表的 DAL 类来处理查询和命令。这将您的查询逻辑集中在一个地方:
public class StudentDAL : DALBase
{
public DataSet GetAllStudents()
{
DataSet ds = null;
//query to ask
string query = "SELECT * FROM Student";
using (OleDbCommand command = new OleDbCommand(query))
{
ds = Fill(command);
}
return ds;
}
public void UpdateStudentName(int studentID, string name)
{
string query = "UPDATE Student SET Name = @Name WHERE StudentID = @StudentID";
using (OleDbCommand command = new OleDbCommand(query))
{
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@StudentID", studentID);
ExecuteNonQuery(command);
}
}
}
然后,您将创建一个特定于表的 BLL 类来处理需要在 DAL 和需要数据库信息的类之间发生的任何中间逻辑:
public class StudentBLL
{
private _studentDAL = new StudentDAL();
public DataSet GetAllStudents()
{
return _studentDAL.GetAllStudents();
}
public void UpdateStudentName(Student student)
{
_studentDAL.UpdateStudentName(student.StudentID, student.Name);
}
}
在这种特殊情况下,这些方法几乎只是调用相应的 DAL。但是,如果您需要执行任何其他逻辑(类型转换、某种公式等),这就是发生的地方。我想我的假设UpdateStudentName
方法是一个小例子。如果您查看它,您会发现它只是接收一个Student
对象并将其拆分以发送到 DAL。这可以防止 UI 层(或其他调用类)需要担心这一点。
最后,您将通过需要信息的类中的 BLL 对象调用数据库:
public class SomeOtherClass
{
DataGridView dataGridView1;
public void PopulateDataGridView1()
{
dataGridView1.DataSource = new StudentBLL().GetAllStudents();
}
}
现在,这可能不完全符合您的需求,我相信人们可能会争论这种方法,但这更多地是一个示例,说明您可以如何简化数据访问以使其更多可维护和可扩展。