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

推荐订阅源

AI
AI
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
N
News | PayPal Newsroom
V2EX - 技术
V2EX - 技术
博客园 - 【当耐特】
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
有赞技术团队
有赞技术团队
S
Schneier on Security
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
H
Hacker News: Front Page
The Last Watchdog
The Last Watchdog
Schneier on Security
Schneier on Security
PCI Perspectives
PCI Perspectives
IT之家
IT之家
Project Zero
Project Zero
博客园 - 司徒正美
P
Privacy International News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Jina AI
Jina AI
Security Latest
Security Latest
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
NISL@THU
NISL@THU
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity

博客园 - 学习.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注入的危险。
我到底应该用什么更好的方法? 大家说说在遇到类似问题时,是如何处理的,谢谢。