3

.net を使用して最初の Web アプリを構築していますが、非常に大規模な既存のデータベースと対話する必要があります。接続をセットアップし、いくつかのパラメーターを渡すクエリを選択、挿入、更新、および削除するために呼び出すことができるクラスを作成しました。

ボタンのクリックで必要なクエリを記述して接続できますが、これが最善の解決策であるか知りたいですか? データベース コードと他のコードが混在しているため、この方法でデバッグするのは難しいようです。

過去に (他の言語で)、残りのコードによって呼び出されるすべてのデータベース クエリ文字列とパラメーターを含むクラスを作成しました。そうすれば、ストアド プロシージャのパラメーターのような単純なものが変更された場合でも、コードはすべて 1 か所にまとめられます。

.net でこれを検索すると、この方法について何も表示されず、ベスト プラクティスを学びたいと思っています。

    protected void Button1_Click(object sender, EventArgs e)
    {
       NameLabel.Text = UserNoTextBox.Text;

       string spName = "SP_SelectUser";
       SqlParameter[] parameters = new SqlParameter[]
       {
           new SqlParameter("@User_No", UserNoTextBox.Text)
       };

       DataAccess dbAccess = new DataAccess();

       DataTable retVal = dbAccess.ExecuteParamerizedSelectCommand(spName, CommandType.StoredProcedure, parameters);
 }

更新: 私が参照していたクラスは、次の Web サイトの DataAccess クラスでした: http://www.codeproject.com/Articles/361579/A-Beginners-Tutorial-for-Understanding-ADO-NET (クラスはhttp: //www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=361579 )

更新: 最終的に、Entity Framework で MVC 3 を使用することにしました。これは素晴らしいことです。

4

4 に答える 4

6

これは非常に大きなトピックですが、非常に簡単に説明すると次のようになります。

  1. DataTable死ななければなりません (わかりました、いくつかの用途がありますが、一般的には死ななければなりません); 次のようなカスタム タイプの使用を検討してください。

    public class User {
        public int Id {get;set;}
        public string Name {get;set;}
        public string EmployeeNumber {get;set;}
        // etc
    }
    

    多くの ORM ツールは、基礎となるテーブル構造から これらを生成することにも注意してください。

  2. UI とデータ アクセスを混在させないでください。このコードを、理想的には別々のクラスに分けますが、少なくとも別々のメソッドに分けます。

    protected void Button1_Click(object sender, EventArgs e)
    {
        NameLabel.Text = UserNoTextBox.Text;
        var user = SomeType.GetUser(UserNoTextBox.Text);
        // do something with user
    }
    ...
    public User GetUser(string userNumber) {
       ... your DB code here
    }
    
  3. ORM (EF、LINQ-to-SQL、LLBLGenPro) やマイクロ ORM (dapper、PetaPoco など) などのライブラリを使用します。たとえば、dapper を使用したコードは次のとおりです。

    public User GetUser(string userNumber) {
        using(var conn = GetOpenConnection()) {
            return conn.Query<User>("SP_SelectUser",
            new {User_No = userNumber}, // <=== parameters made simple
            commandType: CommandType.StoredProcedure).FirstOrDefault()
        }
    }
    

    またはLINQ-to-SQLを使用します(EFは非常に似ています):

    public User GetUser(string userNumber) {
        using(var db = GetDataContext()) {
            return db.Users.FirstOrDefault(u => u.User_No == userNumber);
        }
     }
    
  4. すべてがストアド プロシージャである必要はありません。以前は、この 2 つの間に大きなパフォーマンスの違いがありましたが、現在はそうではありません。それらを使用する正当な理由 (非常にきめ細かなセキュリティ、複数のアプリケーション コンシューマーとの共有 DB、開発者であると考えるデータベース管理者) はありますが、特に変更をデプロイするときに、メンテナンスの問題も発生します。ほとんどの場合、生の (ただしパラメーター化された) SQL を使用することを躊躇しません。次に例を示します。

    public User GetUser(string userNumber) {
        using(var conn = GetOpenConnection()) {
            return conn.Query<User>(@"
    select [some columns here]
    from Users where User_No = @userNumber",
            new {userNumber}).FirstOrDefault()
        }
    }
    
于 2012-08-30T10:10:36.497 に答える
4

私はこのようなことをします:

コードビハインド

protected void Button1_Click(object sender, EventArgs e)
{
    UserController uc = new UserController();
    User u = UserController.GetUser(Convert.ToInt32(UserNoTextBox.Text);
    NameLabel.Text = u.UserName;
}

そしてあなたのUserController.csで

class UserController{
    public User GetUser(int userId)
    {
        return DataAccess.GetUser(userId);
    }
}

そしてあなたのUser.csで

class User{
    private string _userName;
    public string UserName{ get{ return _userName;} set{ _userName= value;} }
}

そして、Dapperを使用してDataAccess.csで

public User GetUser(int id)
{
    var user = cnn.Query<User>("SP_SelectUser", new {User_No = id}, 
        commandType: CommandType.StoredProcedure).First();
    return user;
}     

これは 1 つのオプションにすぎませんが、別のORMを使用することもできます。これは個人的な好みの問題です。.Net ORM のリストは次のとおりです。

幸運を!

于 2012-08-30T10:04:12.373 に答える
1

一般的なベスト プラクティスは、OOP の世界では言語にとらわれない傾向があります。あなたは、過去に他の OOP 言語でデータ アクセスを扱ったことがあると言うので、.net でもまったく同じことを行うでしょう。一般的なベスト プラクティスの適切なリンクについては、@Oded からの応答を参照してください。

.net のデータ アクセス テクノロジの最適な使用方法に関するガイダンスをお探しの場合は、ADO に関する MSDN の記事を出発点としてお試しください。

于 2012-08-30T10:03:33.717 に答える
0

あなたがやっていることはうまくいきますが、適切な OOP の原則に従っていません。その 1 つは関心の分離です。UIはデータベースと直接やり取りしてはなりません。

すべてのデータ アクセス コードは、UI レイヤーが呼び出すことができる別のレイヤーに配置する必要があります。

また、SOLID の原則同じことを繰り返さないでください も参照してください


データベースとやり取りするとき、多くの人が ORM を使用します。つまり、Entity Framework、nHibernate、Dapper など、.NET アプリケーション用に多数存在します。これらはデータ アクセス レイヤーとして機能するため、アプリケーションでの使用法を調査する必要があります。

于 2012-08-30T09:46:48.917 に答える