gpt4 book ai didi

.net - 改进数据访问层选择方法 Pattern

转载 作者:行者123 更新时间:2023-12-04 08:01:20 25 4
gpt4 key购买 nike

最近我发现自己在编写数据访问层选择方法,其中的代码都采用这种一般形式:

public static DataTable GetSomeData( ... arguments)
{
string sql = " ... sql string here: often it's just a stored procedure name ... ";

DataTable result = new DataTable();

// GetOpenConnection() is a private method in the class:
// it manages the connection string and returns an open and ready connection
using (SqlConnection cn = GetOpenConnection())
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
// could be any number of parameters, each with a different type
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 50).Value = param1; //argument passed to function

using (SqlDataReader rdr = cmd.ExecuteReader())
{
result.Load(rdr);
}
}

return result;
}

或者像这样:
public static DataRow GetSomeSingleRecord( ... arguments)
{
string sql = " ... sql string here: often it's just a stored procedure name ... ";

DataTable dt = new DataTable();

// GetOpenConnection() is a private method in the class:
// it manages the connection string and returns an open and ready connection
using (SqlConnection cn = GetOpenConnection())
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
// could be any number of parameters, each with a different type
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 50).Value = param1; //argument passed to function

using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
dt.Load(rdr);
}
}

if (dt.Rows.Count > 0)
return dt.Rows[0];
return null;
}

这些方法将由业务层代码调用,然后将基本 DataTable 或 DataRecord 转换为表示层可以使用的强类型业务对象。

由于我反复使用类似的代码,我想确保这段代码是最好的。那么如何改进呢?而且,是否值得尝试将通用代码从这里移到它自己的方法中。如果是这样,该方法会是什么样子(特别是关于传入 SqlParameter 集合)?

最佳答案

必须添加我自己的:
Return DataReader from DataLayer in Using statement

新模式使我一次只能在内存中保存一条记录,但仍将连接包含在一个很好的“使用”语句中:

public IEnumerable<T> GetSomeData(string filter, Func<IDataRecord, T> factory)
{
string sql = "SELECT * FROM [SomeTable] WHERE SomeColumn= @Filter";

using (SqlConnection cn = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
cn.Open();

using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return factory(rdr);
}
rdr.Close();
}
}
}

关于.net - 改进数据访问层选择方法 Pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com