鱼跃千里

 

超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider)

在做一个小东西的时候出现了这个问题,就是使用VS调试几次项目后,使用SQL Server Management Studio管理数据库时,使用SA登录就会出现这个错误,当然,如果项目中的数据库连接字符串中使用的sa验证,那么项目也会连不到数据库的.可是如果是在 Server Management Studio和项目中使用Windows身份验证,就没有任何问题.
提示错误消息如下
Code

初步推断可能是由于我的那个DBAcess类没有正确的关闭数据库连接吧.在网上搜了一通,也没有什么实质性的进展


      这里有一个帖子(点我看帖子)反映的情况好像和我的类似,可是他没有说具体的解决方案,仅仅提到优化了一下存储过程

        CSDN这里有一个类似问题(点我看原文)大意就是说要把TimeOut时间设的长一点,可是我的不是这个原因       
        初步分析原因为对MSSQL操作时连接超时,知道这事,以前没留意,大概是在配置文件中设置连接时限,在网上找了下解决方法,大多说在数据库连接字符串里解决  

SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;")

改为:

SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;Connect Timeout=500")

似乎没效果。依然运行30秒即报超时!
突然感觉似乎应该可以在连接数据库代码中指明,式了下con的属性,有个ConnectionTimeout,

SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=;");
con.ConnectionTimeout 
= 180;//报错,属性ConnectionTimeout 为只读!

 尝试失败,再接着看command对象属性,发现其也有类似属性!CommandTimeout设置一下:

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout 
= 180;

 再运行,即解决,这里设置的时间的180秒,即三分钟!可根据需要设置,如果过长,也可以设置为0,当此属性设置为0时表示不限制时间。此属性值应该慎用。还需要在Web.config配置文件中设置http请求运行时限间

<system.web>  
<httpRuntime maxRequestLength="102400" executionTimeout="720" />
</system.web>

这里设置的为720秒,前面的属性maxRequestLength一般用于用户上传文件限制大小!默认一般为4096 KB (4 MB)。


      到底是怎么回事呢,现在也没有搞定,所以我只能是认为我的那个DBAcess类的问题了,所以把它贴出来大家分析,看看原因,希望有人帮我解答一下,代码比较长,不想在网页上看的我提供了下载 (点我下载) 
Code


 

posted on 2008-06-01 02:55 张跃 阅读(6139) 评论(13)  编辑 收藏 网摘 所属分类: ASP.NETC#

评论

#1楼 2008-06-01 03:43 求知无傲      

之前偶也遇到类似的问题IIS,VS代码,配置文件等多方措施均未能达到我所需要的效果。   回复  引用  查看    

#2楼 2008-06-01 06:56 oldmoon[未注册用户]

初步看了一下,你的个DBAcess类应该没有什么问题,是不是本身你的数库结构设置不合理而导致的?一般的默认的Timeout就够用了   回复  引用    

#3楼 2008-06-01 10:15 小龙3      

试一试:
http://hi.baidu.com/idragonet/blog/item/31c4b9af5cf023c97dd92a41.html" target="_new">http://hi.baidu.com/idragonet/blog/item/31c4b9af5cf023c97dd92a41.html
  回复  引用  查看    

#4楼 2008-06-01 10:34 静静的黎明      

public IDataReader ExecuteReader(string commandtext)
{
IDataReader reader = null;
try
{
cmd.CommandText = commandtext;
reader = this.ExecuteReader();

//如果ExecuteReader()里你的sqlconnection Open了之后,假如你的commandtext有错误, 导致抛出异常,下面的catch都没有去关闭sqlconnection, 你应该在捕获到异常的代码里,判断reader是否为空,并关闭它
}
catch (Exception ex)
{
if(reader != null)
reader.Close(); //这里
if (handleErrors)
strLastError = ex.Message;
else
throw;
}
catch
{
throw;
}

return reader;
}
  回复  引用  查看    

#5楼 2008-06-01 10:50 横刀天笑      

我觉得是你的代码的问题
你的很多conn会因为异常而得不到关闭,或者你在调试的时候,有时调试没有结束,你就强行停止调试,conn也没有关闭。你可以把conn.Close()移到finally里面去

还有一点,这种把Command作为类的实例变量,类一初始化就实例化一个的方式感觉不怎么舒服,至于原因我也说不清楚,我觉得Connection,Command对象的创建和关闭都放在方法里面比较好
  回复  引用  查看    

#6楼[楼主] 2008-06-01 13:14 张跃      

@静静的黎明
恩,我想应该是这样的,我试一下
@横刀天笑
呵呵,刚刚发现,不能把链接关闭方法哦finally中,reader要保持连接,刚才没有注意,结果调试的时候发现说reader已经关闭了.现在改成这样了
IDataReader reader = null;
try
{
this.Open();
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
if (handleErrors)
strLastError = ex.Message;
else
throw;
if (reader != null)
reader.Close();
if (cmd.Connection.State != ConnectionState.Closed)
this.Close();
}
  回复  引用  查看    

#7楼[楼主] 2008-06-01 13:20 张跃      

@横刀天笑
至于那个cmd的实例问题,我觉得这样写的话就不需要管内部的方法或者有可能一个cmd没有关闭导致获得另一个cmd的时候出错
比如调用的时候就可以直接像这样
 DBAccess db = new DBAccess();
     db.SetCmdType(CommandType.StoredProcedure);
     db.HandleExceptions = true;
     db.AddParameter("@StuID", Convert.ToInt32(Session"StuID"]));
     db.AddParameter("@TeamName", teamName);
     db.AddParameter("@PaperID", ddlPaper.SelectedValue);
     db.ExecuteNonQuery("JoinTeam");
  回复  引用  查看    

#8楼 2008-06-01 16:01 负荷开关[未注册用户]

学习 以后天天来看看   回复  引用    

#9楼 2008-06-01 16:44 wuhouci[未注册用户]

我在一个开源的项目中见到过类似DBAccess这个类有问题,我前几天用到它,有时连接关闭不了,后来改了改,还可以,   回复  引用    

#10楼 2008-06-01 19:22 中央空调[未注册用户]

觉得这样写的话就不需要管内部的方法或者有可能一个cmd没有关闭   回复  引用    

#11楼 2008-06-02 16:02 Ryan Yu      

应该是代码运行问题。   回复  引用  查看    

#12楼 2008-06-05 01:32 超晨      

说明你的sql语句或者存储过程该优化了,一般都是这个问题引起的   回复  引用  查看    

#13楼[楼主] 2008-06-11 14:11 张跃      

最终解决了,就是连接没有关闭的缘故,发布网站后,运行到某些地方就会无法连接数据库,我把所有连接数据库的地方都检查了一下,添加了关闭reader和db.Dispose() 然后就正常了.
不过SQL Server Management Studio 却再也不能用sa登录了,郁闷
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1211474




相关文章:

相关链接:

导航

统计

公告

www.zylovezw.cn

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类(44)

随笔档案(32)

文章档案(1)

最新评论

  • 1. re: Google AdSense 申请通过了
  • @流牛木马
    。。。。。这都被你发现了
  • --张跃
  • 2. re: Google AdSense 申请通过了
  • --引用-------------------------------------------------- 张跃: @网赚者 呵呵,英文blog流量比较大的,不过如果想通过这个赚钱,还是做一些英文信...
  • --流牛木马
  • 3. re: Google AdSense 申请通过了
  • @网赚者 呵呵,英文blog流量比较大的,不过如果想通过这个赚钱,还是做一些英文信息网站而不是个人blog。我有一同学就是做一些垃圾站(不是贬义啦,是指对自己没有什么用的网站)来玩,Google PV...
  • --张跃
  • 4. re: Google AdSense 申请通过了
  • 我今天刚刚通过了 google adsense 的申请,一个仅仅建立一个多月的英文博客。
  • --网赚者
  • 5. re: 腾讯笔试
  • @张跃
    加油,呵呵,面试官很友好,使劲忽悠。
  • --天启

阅读排行榜

评论排行榜