我已将我的数据库作为数据源添加到visual studio中的C#项目中。现在,我想查询数据库。我是否需要手动设置数据库的连接字符串?
public void setSQL()
{
string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\jasper\\Desktop\\AutoReg\\AutoReg.accdb;";
OleDbConnection MyConn = new OleDbConnection(ConnStr);
MyConn.Open();
DataSet ds = new DataSet();
//query to ask
string query = "SELECT * FROM Student";
using (OleDbCommand command = new OleDbCommand(query, MyConn))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
adapter.Fill(ds);
dataGridView1.DataSource = ds;
MyConn.Close();
}
}
}
每次需要查询数据库时,是否需要完成所有这些过程?
答案 0 :(得分:2)
如果您只是为一个查询手动设置数据库连接,那么实际上并没有更简单的方法。不过,我建议稍微清理一下代码。正如您的示例中所写,如果查询过程中出现错误,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;
}
如果您希望在未来添加更多查询时将其切换为更方便,那么我建议您转到 3层架构业务逻辑层(BLL)和数据访问层(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
}
然后,您可以为Student表创建一个特定于表的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();
}
}
现在,这可能不完全符合您的需求,我相信人们可以争论这种方法,但这更像是一个如何简化您的数据访问的示例它更具可维护性和可扩展性。