请教前辈们,关于SQL Server的事物和存储过程!

qq_36794633 2016-12-16 12:36:42


上图是我考卷的表的设计,设计也许很多地方不恰当,还望前辈们多多批评。
我现在写了一个存储过程并嵌套事务,在存储过程中把参数和sql语句码好,才发现参数太多了,我就百度看看存储过程能否接收c#对象,如果可以接收这个C#对象,那么就能实现,只需连接数据库一次,就能将一张试卷的题分别写入表中。

上图只能添加一部分数据并且还得连接多次数据库才能将数据插入完。

请教各位前辈们,如果要将试卷上的数据插入数据库,使用何种方法会更为恰当。辛苦大家展示下能解决我当前实际需求的代码,分数绝对不少给!

1、向试题表插入数据
insert into [dbo].[ExaminationQuestions]
(ExaminationQuestionsTitle, ReleaseTime, ExaminationQuestionsTotalScore, MarkingTime,
ModifyQuestion, StateMark, DeleteMark)
values
(
'2015年北京高考卷',GETDATE(),100,dateadd(day,10,getdate()),
GETDATE(),0,0
)
2、--向子题表中插入一条数据(大题下的子题)
insert into [dbo].[ChildQuestions]
(ExaminationQuestionsId, QuestionsId, QuestionsTitle, QuestionsScore, QuestionsMark, StateMark, DeleteState)
values
(
1,'二','简答题',20,3,0,0
)
3、 --向子题下的小题表中插入一条数据,选择题
select * from [dbo].[SelectionSet]
insert into [dbo].[SelectionSet]
(
ChildQuestionsId, SelectionSetId, SelectItem,SelectTitle,
QuestionsAnswer, SelectItemContent, Score, QuestionsMark,
StateMark, DeleteMark
)
values
(
1,1,'D','请回答谁最帅气!','','CC最帅啦!',2,1,0,0
)
...全文
182 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36794633 2016-12-16
  • 打赏
  • 举报
回复
qq_36794633 2016-12-16
  • 打赏
  • 举报
回复
需求: 尽量少连接数据库,达到向数据库依次插入试题信息。
  • 打赏
  • 举报
回复
最后还是回到最初的知识点: 你为了最低级的一个 insert 操作,弄出了“这么大动静”,废了九牛二虎之力做了人家千分之一都不到的事情,何必呢? 这个时候不要使用存储过程。(这里)存储过程太垃圾了。
  • 打赏
  • 举报
回复
关于“并且还得连接多次数据库才能将数据插入完”的话,我看不懂这是什么意思。 在应用程序中要执行10000条sql语句或者调用1000次存储过程,也只需要创建一次数据库逻辑连接啊?!!只不过当你的应用“跨用户交互中断”的这个梗的时候,你才应该关闭数据库逻辑链接(将物理连接尽快释放回连接池,给别的逻辑连接去复用)。因为用户交互的间隔时间是不固定的,不能在此时胡乱独占宝贵的数据库连接资源。 如果你要(不经中断地)连续执行10000次数据库操作,你自然只要连接一次数据库会话就可以了。 另外,Sql Server 默认会对每一个 sql 语句(包括你调用存储过程的语句)启用一个事务。而如果你的应用程序中显式地启用了 DbTransaction,那么你更可以将多条语句(例如10条)放到一个事务中。 总之,你的存储过程中还去写什么 begin tran、comm tran,纯粹是多此一举的做法。 第三,当存储过程执行错误的时候,应该 raiserror 来从数据库系统向应用程序抛出数据库异常(此时自然就自动回滚事务了),而你的代码却并不抛出异常。这种想当然地 try...catch 代码真是醉了。
  • 打赏
  • 举报
回复
没有必要使用存储过程的地方,不要使用存储过程。直接在你的应用程序中发送 sql 语句即可。

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧