惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
人人都是产品经理
人人都是产品经理
月光博客
月光博客
V
V2EX
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
博客园 - 聂微东
博客园 - 司徒正美
博客园 - 【当耐特】
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志

博客园 - 学习.NET

听说微软要收购 winrar 请教泛型方法重载的一个小问题 用guid类型的字段作主键,用char(36)好还是用uniqueidentifier好? 批判工厂方法模式 李斯与赵高 MSDN Magazine 微软首席架构师Anders Hejlsberg谈C#的一些东西。 迷惘中 实现简单多层表头的办法 如何实现数据转移?不知这个叫法对不对。 什么是多套帐?如何实现? 代码复用 下载VS.NET2005 Beta1 人就是人 何时需要非规范化 复习基础知识:数据规范化 连接本机时,localhost的意思 正在出差,很长时间没来。 whidbey
批量插入与更新
学习.NET · 2006-04-21 · via 博客园 - 学习.NET

近来学习什么是三层架构,也就是这个图了,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注入的危险。
我到底应该用什么更好的方法? 大家说说在遇到类似问题时,是如何处理的,谢谢。