批量插入与更新
近来学习什么是三层架构,也就是这个图了,http://msdn.microsoft.com/library/en-us/dnbda/html/f00aa01.gif
http://msdn.microsoft.com/library/en-us/dnbda/html/distapp.asp
Model层,用贫血的实体,
[Serializable]
public class CustomerInfo
{
#region Private Variables
private System.Guid _customerId;
private System.String _name;
#endregion
#region Constructors
#endregion
#region Properties
public System.Guid CustomerId
{
get {return _customerId;}
set {_customerId = value;}
}
public System.String Name
{
get {return _name;}
set {_name = value;}
}
#endregion
}
数据访问层,使用了EL:
public class CustomerDataServices : IDataServices
{
#region Private Field
#endregion
public CustomerInfoCollection SelectCustomersByNameInexact(System.String name)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(SR.SelectCustomersByNameInexact);
db.AddInParameter(cmd, "Name", DbType.String, name);
List<CustomerInfo> customers = new List<CustomerInfo>();
try
{
using(IDataReader dr = db.ExecuteReader(cmd))
{
while(dr.Read())
{
CustomerInfo customer = new CustomerInfo();
customer.CustomerId = (System.Guid)dr["CustomerId"];
customer.Name = (System.String)dr["Name"];
customers.Add(customer);
}
dr.Close();
}
}
catch(InvalidOperationException ex)//catch(DataException ex)
....
return customers.Count > 0 ? customers : null;
}
public bool InsertCustomer(System.Guid customerId, System.String name)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(SR.InsertCustomer);
cmd = db.GetStoredProcCommandWrapper(SR.InsertCustomer);
db.AddInParameter(cmd, "CustomerId", DbType.Guid, customerId);
db.AddInParameter(cmd, "Name", DbType.String, name);
bool ret = false;
try
{
db.ExecuteNonQuery(cmd);
ret = true;
}
catch(DataException ex)
......
return ret;
}
}
突然发现,在添加一条订单时,要添加多条订单项,批量添加和更新应该如何做呢?
我原来的数据操作都是用的存储过程。
方法一:循环调用 插入一条记录 的方法。我一次就添加30-300条记录,感觉这样不是很好。
方法二:针对不同的数据库分别建立SQL文本的常量文件,就是如同Pet Shop那样将SQL文本放到代码文件中,专门建立一个只放SQL文本的常量文件(static readonly)。根据配置利用反射加载SQL文本,在批量添加和更新时,在循环语句中拼接SQL文本,添加命令参数,也是如同Pet Shop那样。这个方法感觉麻烦。
方法三、针对不同数据库分别定义一个类似DbCommandBuilder的类,从而得到批量添加和更新的Command。没有仔细考虑这个办法的具体实现方式。
方法四、将批量更新和添加的实体的各个字段用循环一个字符串作为参数传给存储过程,在存储过程中解析这个字符串,拼接SQL文本。这个方法显然有sql注入的危险。
我到底应该用什么更好的方法? 大家说说在遇到类似问题时,是如何处理的,谢谢。
http://msdn.microsoft.com/library/en-us/dnbda/html/distapp.asp
Model层,用贫血的实体,
[Serializable]
public class CustomerInfo
{
#region Private Variables
private System.Guid _customerId;
private System.String _name;
#endregion
#region Constructors
#endregion
#region Properties
public System.Guid CustomerId
{
get {return _customerId;}
set {_customerId = value;}
}
public System.String Name
{
get {return _name;}
set {_name = value;}
}
#endregion
}
数据访问层,使用了EL:
public class CustomerDataServices : IDataServices
{
#region Private Field
#endregion
public CustomerInfoCollection SelectCustomersByNameInexact(System.String name)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(SR.SelectCustomersByNameInexact);
db.AddInParameter(cmd, "Name", DbType.String, name);
List<CustomerInfo> customers = new List<CustomerInfo>();
try
{
using(IDataReader dr = db.ExecuteReader(cmd))
{
while(dr.Read())
{
CustomerInfo customer = new CustomerInfo();
customer.CustomerId = (System.Guid)dr["CustomerId"];
customer.Name = (System.String)dr["Name"];
customers.Add(customer);
}
dr.Close();
}
}
catch(InvalidOperationException ex)//catch(DataException ex)
....
return customers.Count > 0 ? customers : null;
}
public bool InsertCustomer(System.Guid customerId, System.String name)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(SR.InsertCustomer);
cmd = db.GetStoredProcCommandWrapper(SR.InsertCustomer);
db.AddInParameter(cmd, "CustomerId", DbType.Guid, customerId);
db.AddInParameter(cmd, "Name", DbType.String, name);
bool ret = false;
try
{
db.ExecuteNonQuery(cmd);
ret = true;
}
catch(DataException ex)
......
return ret;
}
}
突然发现,在添加一条订单时,要添加多条订单项,批量添加和更新应该如何做呢?
我原来的数据操作都是用的存储过程。
方法一:循环调用 插入一条记录 的方法。我一次就添加30-300条记录,感觉这样不是很好。
方法二:针对不同的数据库分别建立SQL文本的常量文件,就是如同Pet Shop那样将SQL文本放到代码文件中,专门建立一个只放SQL文本的常量文件(static readonly)。根据配置利用反射加载SQL文本,在批量添加和更新时,在循环语句中拼接SQL文本,添加命令参数,也是如同Pet Shop那样。这个方法感觉麻烦。
方法三、针对不同数据库分别定义一个类似DbCommandBuilder的类,从而得到批量添加和更新的Command。没有仔细考虑这个办法的具体实现方式。
方法四、将批量更新和添加的实体的各个字段用循环一个字符串作为参数传给存储过程,在存储过程中解析这个字符串,拼接SQL文本。这个方法显然有sql注入的危险。
我到底应该用什么更好的方法? 大家说说在遇到类似问题时,是如何处理的,谢谢。