首页 新闻 会员 周边

SQL存储过程

0
悬赏园豆:30 [已解决问题] 解决于 2014-02-17 21:58

数据库如图

 

怎么在插入一个TestReport的时候将其他表相关的数据一起插入,这个存储过程怎么写。

包括触发器什么的。

需要整个存储过程写法

直接使用实体模型插入一个report对象,好慢。有好方法吗

GhostRider_zkc的主页 GhostRider_zkc | 初学一级 | 园豆:18
提问于:2014-01-13 19:32
< >
分享
最佳答案
0

你这样测试的不是很准确,测试时间开销 Stopwatch

                Stopwatch sw = new Stopwatch();
                sw.Start(); //开始计时
                db.TestReport.Add(testReport);
                db.SaveChanges();
                Console.WriteLine("4");  //这条语句要放到计时结束,打印输出是耗时的
                sw.Stop();  //计时结束
收获园豆:30
秋壶冰月 | 大侠五级 |园豆:5903 | 2014-01-13 19:44

额···我想知道的是如何改进

GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-13 20:52

@GhostRider_zkc: 你这样测试一条数据,也是要创建一个Connection连接对象的,创建Connection对象是比较耗时的,不然也不会默认开启连接池的,你要插入的比较快的话,可以通过ef直接使用sql语句的方式来执行,用StringBuilder来拼接多条语句,拼接好一块执行,这样速度比快

秋壶冰月 | 园豆:5903 (大侠五级) | 2014-01-14 13:11
其他回答(1)
0

你如果用存储过程插入会很麻烦,得传多少参数啊,如果用ado.net整体插入太慢可一个表一个表的插入从主表开始

Zery | 园豆:6151 (大侠五级) | 2014-01-14 09:51

从主表开始,每次插入一个数据记录,然后获得他的ID给下一个表用?

这样也挺麻烦哦

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 10:00

@GhostRider_zkc: 你是用的EF吗?还是ADO.NET, 看你的图应该不是用的ADO.NET,因为ADO.NET没有实体对象概念

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 10:06

@Zery: 用EF,但是我一个Report对象里面的Result就几千条,插入速度好慢啊

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 10:07

@GhostRider_zkc: 

用EF就好处理了,换种方法实现试 

using(var dbContext = new Enttity())

{

dbContext.table1.AddObject(Report.table1);

dbContext.table2.AddObject(Report.table2);

dbContext.table3.AddObject(Report.table3);

dbcontext.SaveChange()

}

一个个表插入再整体保存

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 10:11

@Zery: 你这table1,table2指的是?我一个Report有几个Unit,每个Unit有几个Diagram,每个Diagram会有几千个Result。

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 10:39

@GhostRider_zkc: 你的Report对象是不是可以通过导航属性把其子表的数据加载出来?

如果是那写法就是Report.TestUnit.Diagraminfo.TestResult

dbContext.TestUnit.AddObject(Report.TestUnit);

dbContext.Diagraminfo.AddObject(Report.TestUnit.Diagraminfo);

dbContext.TestResult.AddObject(Report.TestUnit.Diagraminfo.TestResult);

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 10:43

@Zery: 一层层添加后在SaveChange()?我试试

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 10:44

@Zery: 还是一样,速度没变化

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 10:51

@GhostRider_zkc: 贴你插入的关键代码出来

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 11:11

@Zery: 

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 14:18

@GhostRider_zkc: 

这种写法太耗时了,三层循环EF本身没有批量增加的方法 所以你这里还是要循环添加到上下文中,但是不用嵌套

可以把对象分别取出 如

var testUnitList = testReport.TestUnit.ToList();

foreach(var item in testUnitList)

{

  db.TestUnit.Add(item)

}

接下来的几个对象同样处理

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 14:40

@Zery: 不嵌套怎么取出DiagramInfo呢

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 15:23

@GhostRider_zkc: testReport.TestUnit.DiagramInfo.Tolist();

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 15:29

@Zery: 一个Report有几个Unit,这样不知道是哪个Unit的,点不出DiagramInfo

支持(0) 反对(0) GhostRider_zkc | 园豆:18 (初学一级) | 2014-01-14 15:31

@GhostRider_zkc: 不管几个Unit不都是要存DB的吗,把Unit下的Diagraminfo加载到一个集合中然后去存db,我的思路是把纵向的数据变为横向的数据后再存储,有点用空间换时间的感觉

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2014-01-14 17:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册