最合适的访问数据的方式

时间:2016-01-14 07:24:56

标签: c# mysql sql

方法1:

  public class1
  {
     private string _val1;
     private string _val2;

     public string Value1
     {
       get {return _val1;}
     }

     public string Value2
     {
       get {return _val2;}
     }

     public void ReadingDataFromDB()
     {
        //code to retrieve data from database
        if(Reader.read())
        {
          _val1 = reader["val1"].ToString();
          _val2 = reader["val2"].ToString();
        }
     }
  } 

方法2:

public class1
{
   public void ReadingDataFromDB(out string _val1, out string _val2)
   {
      _val1 = "";
      _val2 = "";
      //code to retrieve data from database
      if(Reader.read())
      {
        _val1 = reader["val1"].ToString();
        _val2 = reader["val2"].ToString();
      }
   }
 } 

方法1 类中有属性,但在方法2 类中有一个带输出参数的方法。两者都可用于从数据库中检索数据。

我已经看到,方法1:通常用于业务逻辑,方法2 用于数据访问。

我的问题是,从上面的方法1 方法2 ,在数据访问类中使用哪个更好?除个人意见外,还有其他具体原因吗?

2 个答案:

答案 0 :(得分:2)

我建议这样的事情(方法1改进或方法3):

  public class MyClass {
    //TODO: find better names for Value1, Value2
    public String Value1 {get; private set}
    public String Value2 {get; private set}

    // static: the method actually creates an instance as read form DB
    public static MyClass ReadFromDB() {    
      //TODO: Create a connection, SQL command here

      if (Reader.Read()) {
        return new MyClass() {
          // Do not forget about NULL
          Value1 = reader["val1"].IsDBNull ? null : Convert.ToString(reader["val1"]),
          Value2 = reader["val2"].IsDBNull ? null : Convert.ToString(reader["val2"])
        } 
      }
      else
        return null; // or throw an exception - no data in DB
    }
  }

...

  MyClass test = MyClass.ReadFromDb();

  Console.Write(test.Value1);

至于问题中的建议:方法2 破坏数据封装:当我们期望相应的属性时,它会返回两个string(因为我们正在使用class1) ;另一个问题是out很难读懂。至于方法1 ,我们通常期望“ReadingDataFromDB”将从数据库中读取数据并返回intance(class1),这就是为什么我将方法重新设计为static和添加return

答案 1 :(得分:1)

查看ORM,例如EntityFramework

然而:

基本上你应该有一个模型:

class FooModel {
    public string Value1 {get;set;}
    public string Value2 {get;set;}
}

还有一个知识库:

class FooRepository {
   private _db;

   public FooRepository(SqlConnection db) {
       _db = db;
   }

   public FooModel GetFooModelById(int id) {
       //...
       var model = new FooModel {
           Value1 = reader["val1"].ToString(),          
           Value2 = reader["val2"].ToString()          
       };
       //...
   }

   public List<FooModel> GetFooModelCollection() {
       //...
   }

}

将它们结合在一起:

var connection = new SqlConnection(...);
var repo = new FooRepository(connection);
var myFoo = repo.GetFooModelById(42);