【发布时间】:2014-01-07 16:35:59
【问题描述】:
我有一个通用的数据访问方法,如下所示。它工作正常。但是,基于数据类型(在ExecuteNonQueryWithTextCommandType方法中)有多个if blocks。另外,InsertLogSeverity 方法中用于准备List<CommandParameter> 的冗余代码太多。
如何重构这段代码?
参考文献
- How can I easily convert DataReader to List<T>?
- Use of Generic Delegates
- Fastest method for SQL Server inserts, updates, selects
- Writing a Portable Data Access Layer
- DAL: Retrieve a DataTable using a Stored Procedure
- How to improve data access layer select method Pattern
- Return DataReader from DataLayer in Using statement
通用 DAL
public class MyCommonDAL
{
public void ExecuteNonQueryWithTextCommandType(string commandText, List<CommandParameter> commandParameters)
{
string connectionString = @"Server=XXXX;Database=CostPage_Dev;User Id=hhhh;Password=xxxx";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = commandText;
command.CommandTimeout = 0;
foreach (CommandParameter parameterDetail in commandParameters)
{
if (String.Equals(parameterDetail.ParameterType, "Int"))
{
command.Parameters.AddWithValue(parameterDetail.ParameterName, Convert.ToInt32(parameterDetail.ParameterValue));
}
if (String.Equals(parameterDetail.ParameterType, "String"))
{
command.Parameters.AddWithValue(parameterDetail.ParameterName, Convert.ToString(parameterDetail.ParameterValue));
}
if (String.Equals(parameterDetail.ParameterType, "DateTime"))
{
command.Parameters.AddWithValue(parameterDetail.ParameterName, Convert.ToDateTime(parameterDetail.ParameterValue));
}
}
connection.Open();
command.ExecuteNonQuery();
}
}
}
}
特定于操作的 DAL
public class MyLogDAL
{
public void InsertLogSeverity(LogSeverityTypePOCO logSeverityType)
{
string commandText = @"INSERT INTO dbo.LogSeverityType (LogSeverityTypeID,Name,Description,CreatedDateTime)
VALUES (@LogSeverityTypeID,@Name,@Description,@CreatedDateTime)";
List<CommandParameter> commandParameters = new List<CommandParameter>();
CommandParameter parameter1 = new CommandParameter();
parameter1.ParameterName = "@LogSeverityTypeID";
parameter1.ParameterValue = logSeverityType.LogSeverityTypeID;
parameter1.ParameterType = "Int";
CommandParameter parameter2 = new CommandParameter();
parameter2.ParameterName = "@Name";
parameter2.ParameterValue = logSeverityType.Name;
parameter2.ParameterType = "String";
CommandParameter parameter3 = new CommandParameter();
parameter3.ParameterName = "@Description";
parameter3.ParameterValue = logSeverityType.Description;
parameter3.ParameterType = "String";
CommandParameter parameter4 = new CommandParameter();
parameter4.ParameterName = "@CreatedDateTime";
parameter4.ParameterValue = logSeverityType.CreatedDateTime;
parameter4.ParameterType = "DateTime";
commandParameters.Add(parameter1);
commandParameters.Add(parameter2);
commandParameters.Add(parameter3);
commandParameters.Add(parameter4);
MyCommonDAL dal = new MyCommonDAL();
dal.ExecuteNonQueryWithTextCommandType(commandText, commandParameters);
}
}
客户
class Program
{
static void Main(string[] args)
{
MyLogDAL logDAL = new MyLogDAL();
LogSeverityTypePOCO logSeverityType = new LogSeverityTypePOCO();
logSeverityType.LogSeverityTypeID = 107;
logSeverityType.Name = "N";
logSeverityType.Description = "D";
logSeverityType.CreatedDateTime = DateTime.Now;
logDAL.InsertLogSeverity(logSeverityType);
}
}
DTO
public class LogSeverityTypePOCO
{
public int LogSeverityTypeID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime CreatedDateTime { get; set; }
}
public class CommandParameter
{
public string ParameterName { get; set; }
public object ParameterValue { get; set; }
public string ParameterType { get; set; }
}
【问题讨论】:
-
你为什么使用自己的参数类型而不是SqlParameter? msdn.microsoft.com/en-us/library/…
-
您正在编写专门的 DAL,因为您专门使用 SqlConnection 而不是 IDbConnection