方法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 ,在数据访问类中使用哪个更好?除个人意见外,还有其他具体原因吗?
答案 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);