-3

我已将我的数据库作为数据源添加到 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();
        }
    }
}

每次需要查询数据库时,是否都需要完成所有这些过程?

4

1 回答 1

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; 
}

但是,如果您想切换它并让您在将来需要添加更多查询时更轻松,那么我建议您迁移到具有业务逻辑层 (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();
    }        
}

现在,这可能不完全符合您的需求,我相信人们可能会争论这种方法,但这更多地是一个示例,说明您可以如何简化数据访问以使其更多可维护和可扩展。

于 2013-05-09T16:35:21.120 回答