John Liu 2011-12-23 17:36
不想吵架,只想纯粹探讨下技术问题。
个人觉得ORM和存储过程肯定各有各的用武之地。相对来讲,业务逻辑简单的比如简单的增删改差的操作用ORM应该好点。但涉及稍复杂一些的业务逻辑,需要进行比较复杂的事务处理的时候,存储过程可能更适合。
就楼主所说,一旦需求变化,数据库表,字段等发生变化,使用存储过程的话修改起来复杂。这个观点不敢苟同。当业务需求发生变化而我们又没有预计到这个变化的时候,修改是不可避免的。使用存储过程方式固然需要修改相应的存储过程代码。但使用ORM方式,难道不是同样要在数据库中做字段处理,而且还要在程序中代码做修改。当你的网站需要部署在多个站点的时候,究竟哪个改动大?
tiandong 2011-12-23 01:26
/// <summary>
/// 执行操作,无返回 OK
/// </summary>
/// <param name="dbkey">数据库ID</param>
/// <param name="Procedure">存储过程</param>
/// <param name="prams">参数数组</param>
/// <returns></returns>
public override int ExecuteBatchNonOuerySp(string dbkey, string Procedure, object[][] prams)
{
System.Data.SqlClient.SqlConnection con = null;
System.Data.SqlClient.SqlCommand cmd = null;
System.Data.SqlClient.SqlTransaction trans = null;
int tmp = 0, num = 0, length = 0, length02 = 0;
try
{
length = prams.Length;
con = GetConn(dbkey);
cmd = GetCmd(dbkey);
trans = con.BeginTransaction();
}
catch (System.Exception ex1)
{
throw ex1;
}
// 执行
try
{
//cmd = new System.Data.SqlClient.SqlCommand(Procedure, con);
cmd.Connection = con;
cmd.CommandText = Procedure;
cmd.CommandType = System.Data.CommandType.StoredProcedure; //存储过程执行方式
cmd.Transaction = trans;
System.Data.SqlClient.SqlCommandBuilder.DeriveParameters(cmd);
for (int i = 0; i < length; i++)
{
if (prams[i] != null && prams[i].Length > 0)
{
length02 = prams[i].Length;
for (int j = 0; j < length02; j++)
{
cmd.Parameters[j + 1].Value = prams[i][j];
}
tmp = cmd.ExecuteNonQuery();
if (tmp > 0)
{
num += tmp;
}
if (num == 50)
{
num = 50;
}
}
}
trans.Commit();
}
catch (System.Exception ex2)
{
trans.Rollback();
throw ex2;
}
finally
{
trans.Dispose();
} return num;
}
tiandong 2011-12-23 01:26
3、代码如下:
public class MssqlDataBase : BaseDataBase
{
private static object flag = 0;
private static Dictionary<string, System.Data.SqlClient.SqlConnection> conlist = null;
private static Dictionary<string, System.Data.SqlClient.SqlCommand> cmdlist = null;
public override void Dispose()
{
string[] dbkeys = null;
if (conlist != null && conlist.Count > 0)
{
dbkeys = conlist.Keys.ToArray<string>();
foreach(string dbkey in dbkeys)
{
conlist[dbkey].Close();
conlist[dbkey].Dispose();
}
conlist = null;
}
if (cmdlist != null && cmdlist.Count > 0)
{
dbkeys = cmdlist.Keys.ToArray<string>();
foreach(string dbkey in dbkeys)
{
cmdlist[dbkey].Dispose();
}
cmdlist = null;
}
if (tranlist != null && tranlist.Count > 0)
{
dbkeys = tranlist.Keys.ToArray<string>();
foreach (string dbkey in dbkeys)
{
tranlist[dbkey].Dispose();
}
tranlist = null;
}
}
public MssqlDataBase()
{
lock (flag)
{
if (conlist == null)
{
conlist = new Dictionary<string, System.Data.SqlClient.SqlConnection>();
cmdlist = new Dictionary<string, System.Data.SqlClient.SqlCommand>();
}
}
}
private static System.Data.SqlClient.SqlConnection GetConn(string dbkey)
{
System.Data.SqlClient.SqlConnection con = null;
dbkey = dbkey.Trim().ToLower();
if (!conlist.ContainsKey(dbkey))
{
con = new System.Data.SqlClient.SqlConnection(dbkey);
con.Open();
conlist.Add(dbkey, con);
}
else
{
con = conlist[dbkey];
}
return con;
}
public static System.Data.SqlClient.SqlCommand GetCmd(string dbkey)
{
System.Data.SqlClient.SqlCommand cmd = null;
dbkey = dbkey.Trim().ToLower();
if (!cmdlist.ContainsKey(dbkey))
{
cmd = new System.Data.SqlClient.SqlCommand();
cmdlist.Add(dbkey, cmd);
}
else
{
cmd = cmdlist[dbkey];
}
return cmd;
}
tiandong 2011-12-23 01:25
1、问题描述:
以下代码,在插入100,0000笔23个栏位的IIS日志记录时候,
测试结果显示:执行时间为4.6秒,客户端CPU和内存占用分别为10%和25MB;
但是,MSSQL 2008 R2服务器上显示数据库进程使用内存最后达到898MB无法释放;[b]但是我的程式中最后Disponse()释放资源的执行,没有在服务器上释放SQL内存资源,这个是为什么?有办法解决吗?谢谢。[/b]
2、系统环境:
服务器:WINDOWS 2003 SERVER + MSSQL SERVER 2008 R2 EnterPrise
客户端:WINDOWS 2003 SERVER + VISUAL STUDIO 2008
(张超) 2011-12-22 11:27
我猜测是 没有乱吧
(张超) 2011-12-22 11:25
这个算法的最坏情况是什么?
阿斯兰 2011-11-21 14:54
mark
skhung 2011-11-07 14:34
Thanks a lot!
Mindmanager 2010 也有同樣的問題, 使用大師您的方法也可以解決!
sd02b0825 2011-10-24 11:54
用SqlBulkCopy试了一下导入2000条数据,结果每一次都比我用循环拼接select... union慢
hao_2468 2011-10-21 17:43
最近一直在用SqlBulkCopy,非常好用,就是有时一次性处理数据较多的时候,会报连接超时的问题。虽然微软提供了补丁,说可以解决这个问题,但是客户的服务器就是不让装,只能把数据分批处理了。
深山老林 2011-10-10 15:12
@Drek
可以参考:
http://www.cnblogs.com/taven/archive/2010/01/13/1646244.html
Drek 2011-10-10 14:48
请教下
iis6如何发布和部署呢。本机调试是OK,一发布就找不到页面。报404错误。iis7当然没问题,可惜公司服务器是iis6的
hymer 2011-09-14 21:57
非常感谢!
SIMON_YAO 2011-08-25 14:36
mssql 2005 "Create Type PassportTableType as Table" 报错哦
乐章 2011-08-10 15:55
我也写了一个类似的验证类
http://www.cnblogs.com/ark/archive/2011/08/09/2132597.html
火星大能猫 2011-07-26 15:09
我也如此[quote]不若相忘于江湖:
如果出错了不记录的话... 那程序崩溃时,,, 你怎么排错. [/quote]
我也这么认为.
深山老林 2011-07-12 21:30
首先,我很难想象到什么场景中涉及到批量插入这么多条数据,如果因为超时导致了错误,只能说明选用SQLServer数据库是一种不明智的选择。
zqwuwei 2011-07-12 17:44
[quote]深山老林:这个的确也是一种解决问题的办法,不过存在这样的问题,多数是设计问题导致的。[/quote]
具体是什么设计问题?
深山老林 2011-07-12 10:18
这个的确也是一种解决问题的办法,不过存在这样的问题,多数是设计问题导致的。
zqwuwei 2011-07-12 09:57
把这个属性设置下SqlBulkCopy.BulkCopyTimeout
深山老林 2011-06-07 07:23
虚拟机的话简单使用桥接就可以了,环境配置可以去网上搜索教材。
羽纷飞 2011-06-06 20:14
很纠结,虚拟机环境都没搭好,更别提镜像备份了。博主有关于虚拟机方面的教程或文档么?
suijin 2011-04-06 21:51
谢谢了 大师,我用win7刚刚解决,特地注册表示感谢!
狼来了 2011-02-24 09:13
支持!感谢!
awei20081 2011-02-10 10:11
http://www.bsdown.com/ask/d/1010/36587.html这个更直接些
chenyizh 2010-12-22 00:57
谢谢了
深山老林 2010-12-15 20:08
@夜泪痕
什么模板?
夜泪痕 2010-12-15 19:50
[b]请问,可以下载这个模板吗?[/b]
夜泪痕 2010-12-15 19:47
非常感谢!...
高导 2010-12-13 16:24
不能下载呀。
Ryan_j 2010-11-02 10:18
谢谢 ! 问题 解决…
深山老林 2010-10-23 13:28
@Ryan_j
Mindjet MindManager 9
Ryan_j 2010-10-23 01:13
这个画图的软件是什么?谢谢!
lxwwqw 2010-10-14 23:24
太好了,今天刚好遇到这个问题,其实以前8.0的时候有有碰到了,但是后来用了不同的破解版本后,貌似也能用,就不了了之了。
前些日子安装好了9以后,今天用模板的时候又遇到这个Bug,郁闷中想转到OneNote上去了。
现在问题解决啦,谢谢。
深山老林 2010-09-17 21:11
没有抄,都是自己写的。
路径可能不一样,但是差不多都在那个位置。
麦克刘.Mr 2010-09-17 10:28
大哥咱不抄网络上的行么?
我找了半天也没找到那几个模板文件在那儿!
我XP操作系统
深山老林 2010-09-14 21:52
@nyth
文章中没有提到这个东东。
nyth 2010-09-14 18:44
new CategoryRouteHandler()
在哪里定义的。
深山老林 2010-09-14 16:55
@空呵
可以在MVC项目中添加WebForm页面,编程方式跟原有的方式没有区别,不过最后要在路由表中进行配置。
空呵 2010-09-14 15:46
我想了解,怎样在一个项目中混合使用MVC与传统的asp.net?
NewSea. 2010-08-08 09:15
项目中的所有Ajax,都必须基于Post已成为一种规范,看来,MS也推行这种规范,目前还没有遇到过这个问题。
按规范来吧。
chasefornone 2010-07-09 10:19
受教了,学习中,谢谢楼主详细的讲解!!!
深山老林 2010-06-28 11:36
@温景良(Jason)
互联网项目为了提高并发性,一般都是通过存储过程中使用NOLOCK、READPAST关键字来解决。并发性的提高都是牺牲了其它方面的特性。
看项目的具体对数据的出错需要什么级别,然后考虑具体的提高并发性的办法。这个必须得具体问题具体分析。
至于ado.net是否可以使用这两个关键字,答案是可以的。
温景良(Jason) 2010-06-28 11:29
[quote]深山老林:
@温景良(Jason)
开放式并发处理打开以后会进行并发冲突检测,并且提示用户是否继续进行操作。
如果开启事务,就会锁表,锁表的话,就无法操作,自然不会冲突。
如果是互联网项目,要进行高并发的读取的话,推荐还是在存储过程中使用NOLOCK、READPAST关键字。区别就在于:
NOLOCK 可能把没有提交事务的数据也显示出来.
READPAST 会把被锁住的行不显示出来
[/quote]
在企业管理系统中(MIS),采用并发冲突检测好,还是事务呢,在存储过程去控制把没有提交的数据显示出来好像不是很好,因为会有脏数据,不过READPAST 这个可以,ado.net有提供这个功能吗,之前就经常碰到被锁了,然后客户操作不了,就超时了,一直找不到很理想的解决办法
深山老林 2010-06-27 08:35
@温景良(Jason)
开放式并发处理打开以后会进行并发冲突检测,并且提示用户是否继续进行操作。
如果开启事务,就会锁表,锁表的话,就无法操作,自然不会冲突。
如果是互联网项目,要进行高并发的读取的话,推荐还是在存储过程中使用NOLOCK、READPAST关键字。区别就在于:
NOLOCK 可能把没有提交事务的数据也显示出来.
READPAST 会把被锁住的行不显示出来
温景良(Jason) 2010-06-27 08:26
谢谢你告诉我怎么设置开放式并发处理,但是我想问下,如果开启的话,会有什么好处和坏处,对事务操作有影响吗
深山老林 2010-06-27 07:34
@温景良(Jason)
谢我什么?
温景良(Jason) 2010-06-26 23:32
谢谢