-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

文字通り 1 つのクエリに対して db 接続を手動でセットアップするだけの場合、これほど簡単な方法はありません。ただし、コードを少しクリーンアップすることをお勧めします。あなたの例に書かれて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)。この場合Fill()ExecuteScalar()ExecuteNonQuery()、 などの標準メソッドを定義するベース DAL クラスを作成できます。

この種のセットアップの例はインターネット上に無数にありますが、私はかなり単純な例をまとめました:

これは、考えられる 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 クラスを作成できます。これにより、クエリ ロジックがすべて 1 か所にまとめられます。

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 に答える