0

Firebird ベースからデータ (ユーザーと書籍) を取得するために、次の方法を使用しています。

public static Dictionary<string, Users> getUsersFromDB()
{
  Dictionary<string, Users> users_list = new Dictionary<string, Users>();
  string reqestCommand = "SELECT id, user_type, user_nick, user_pass, user_fname, user_lname, user_identify, e_mail,address, registered FROM USERS";
  string connectionString = connectionPath();
  using (FbConnection fbDB = new FbConnection(connectionString))
  {
    fbDB.Open();
    FbCommand reqest = new FbCommand(reqestCommand, fbDB);
    using (FbDataReader reader = reqest.ExecuteReader())
    {
      while (reader.Read())
      {
        string key;
        Users user = new Users();
        user.ID = reader.GetInt32(0);
        user.type = reader.GetString(1).Trim();
        key = reader.GetString(2).Trim();
        user.nick = key;
        user.password = reader.GetString(3).Trim();
        user.fName = reader.GetString(4).Trim();
        user.lName = reader.GetString(5).Trim();
        user.identify = reader.GetString(6).Trim();
        user.email = reader.GetString(7).Trim();
        user.address = reader.GetString(8).Trim();
        user.registerDate = reader.GetString(9).Trim();
        user.localOrInDb = "inDatabase";
        users_list.Add(key, user);
      }
    }
    fbDB.Close();
  }
  return users_list;
}

public static Dictionary<Guid, Books> getBooksFromDB()
{
  Dictionary<Guid, Books> books_list = new Dictionary<Guid, Books>();
  string reqestCommand = "SELECT book_id, book_title, book_author, book_genre, book_language, book_rel_date, book_page_number, book_available_amount, book_type FROM BOOKS";
  string connectionString = connectionPath();
  using (FbConnection fbDB = new FbConnection(connectionString))
  {
    fbDB.Open();
    FbCommand reqest = new FbCommand(reqestCommand, fbDB);
    using (FbDataReader reader = reqest.ExecuteReader())
    {
      while (reader.Read())
      {
        Guid key;
        Books book = new Books();
        Guid theGuid = new Guid(reader.GetString(0).Trim());
        key = book.ID = theGuid;
        book.title = reader.GetString(1).Trim();
        book.author = reader.GetString(2).Trim();
        book.genre = reader.GetString(3).Trim();
        book.language = reader.GetString(4).Trim();
        book.rel_date = reader.GetString(5).Trim();
        book.page_number = reader.GetInt32(6);
        book.amount = reader.GetInt32(7);
        book.type = reader.GetString(8).Trim();
        book.localOrInDb = "inDatabase";
        books_list.Add(key, book);
      }
    }
    fbDB.Close();
  }
  return books_list;
}

どのように見ることができますか、それらはほとんど同じなので、質問:

それらから1つの機能を作ることは可能ですか? それとも別れた方がいいのでしょうか?

4

2 に答える 2

2

からターゲット クラスのインスタンスを作成するパラメータを渡すことができますReader

public static Dictionary<K,T> GetFromDb<K,T>(Func<Reader,KeyValuePair<K,T> maker) {
    var res = new Dictionary<K,T>();
    // ... your code ...
        while (reader.Read()) {
            res.Add(maker(reader));
        }
    return res;
}

GetFromDbこれで、次のように呼び出すことができます。

var users = GetFromDb<string,User>(reader => {
    string key;
    Users user = new Users();
    user.ID = reader.GetInt32(0);
    user.type = reader.GetString(1).Trim();
    key = reader.GetString(2).Trim();
    user.nick = key;
    user.password = reader.GetString(3).Trim();
    user.fName = reader.GetString(4).Trim();
    user.lName = reader.GetString(5).Trim();
    user.identify = reader.GetString(6).Trim();
    user.email = reader.GetString(7).Trim();
    user.address = reader.GetString(8).Trim();
    user.registerDate = reader.GetString(9).Trim();
    user.localOrInDb = "inDatabase";
    return new KeyValuePair<string,User>(key, user);
});
于 2012-05-12T15:08:02.107 に答える
1

この投稿をチェック

https://stackoverflow.com/a/1464929/988830

拡張メソッドを使用してリーダーを抽象化できます。

ただし、毎回 FBconnection を作成する必要があります。それを関数に入れて別の関数からアクセスしようとすると、リーダーが閉じているという例外が発生します。

using は、接続を閉じるIDisposible http://msdn.microsoft.com/en-us/library/system.idisposable.aspxを使用します。

別のオプション Entity Framework や NHibernate などの orm の使用を開始して、テーブルをオブジェクトにマップします。

于 2012-05-12T15:10:33.780 に答える