粗心大意啊,上个帖子写错了,winform使用SqlConnection遇到重启sqlserver服务竟然一直抛出错误,是重启哦重启。。。

khkly 2012-05-12 07:03:35
分给在 http://topic.csdn.net/u/20120511/21/210ff9b8-05a6-47dd-a9ac-0b439f15b5ce.html?65061

Winform 线程中使用SqlConnection的时候,在普通pc上运行程序时候,当数据库服务器上的sqlserver服务运行时候程序对数据库的操作时正常的,但是测试: 重新启动数据库服务器上的sqlserver服务的时候捕获到下面错误:
用户代码未处理SqlException
在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)

在sqlserver服务关闭时候抛出这个错可以理解,为神马重新启动sqlserver服务后还是一直抛出这个错呢?
当然winform 和 sqlserver服务同在一台电脑上的话不会这样的。。



    public partial class frmMain:Form
{
public const int WM_USER = 0x0400;
public const int WM_RECO = WM_USER + 100;
string strConn = "Max Pool Size = 1024;Data Source=192.168.0.121;Initial Catalog=ODCar;Integrated Security=false;Uid=sa;Pwd=sa";

protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_RECO:
{
Thread thread = new Thread(insertData);
thread.IsBackground = true;
thread.Start();
}
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
static object ooo = new object();

private void InsertData( )
{
string strCmmd = "Insert Into Record EquID Values ('1111') ";
using(SqlConnection conn = new SqlConnection(strConn))
{
using(SqlCommand cmd = new SqlCommand(strCmmd,conn))
{
try
{
conn.Open();
if(Equals(cmd.ExecuteNonQuery(),0))//如果未更新则记录到log日志里
{

}
}
catch(Exception exception)
{
lock(ooo)
using(StreamWriter sw = File.AppendText("Data.log"))
{
sw.WriteLine(nCount.ToString()+" "+ strCmmd);//写时间不含毫秒
sw.Flush();
}
}
}
}
}
}
...全文
227 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
khkly 2012-05-14
  • 打赏
  • 举报
回复
在主线程上,数据库服务重启5秒后就能连接成功了。
khkly 2012-05-14
  • 打赏
  • 举报
回复
来说说情况:
			SqlConnection conn = new SqlConnection(strConn);			 
SqlCommand cmd = new SqlCommand(strCmmd,conn);
cmd.CommandTimeout = 0;
try
{
conn.Open();
if(Equals(cmd.ExecuteNonQuery(),0))//如果未更新则记录到log日志里
{

}
}
catch(Exception exception)
{
lock(ooo)
using(StreamWriter sw = File.AppendText("Data.log"))
{
nCount++;
sw.WriteLine(nCount.ToString()+" "+ strCmmd);//写时间不含毫秒
sw.Flush();
}
}
finally
{
cmd.Dispose();
conn.Close();
}


1、 未设置 数据库 服务器属性的 连接处 远程连接超时值时:报错
超时时间已到。在操作完成之前超时时间已过或服务器未响应。

2、设置远程连接超时值为 1200时;报错
Message = "超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。"

3、设置远程连接超时值为 0时;重启数据库服务30秒后conn.Open成功。
doubleu2005 2012-05-12
  • 打赏
  • 举报
回复
重启服务后应该先断开再链接试试
khkly 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
推荐一种方法,使用线程池、信号量、队列的方法,在函数内部通过while循环来操作同一个连接的打开和关闭,同时通过Thread.Sleep来控制while的循环周期。[/Quote]

这个还真没用过这么复杂的呢,要学习一哈才行。
showlie 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

第二条好像不太成立,现在DefWinProc每5秒new一个thread,在sqlserver正常运行的情况下24+以上winform是正常的,也许是还没达到您说的极限,1秒new一个thread之类的。
[/Quote]
虽然你现在没有发生问题,但是其有潜在的致命错误。
首先,一旦你数据库链接发生问题,而软件却仍然在发送消息,那么就出现我所说的问题。因为数据库连接不上时,有个数据库连接超时情况,你不能保证你发送的消息循环周期比数据库的连接超时时间长,一般情况下肯定是你消息循环周期短,那样就会一边连不上,一边还在继续新建连接,而人为又不能控制信息的发送周期,导致最终数据库连接池溢出。

推荐一种方法,使用线程池、信号量、队列的方法,在函数内部通过while循环来操作同一个连接的打开和关闭,同时通过Thread.Sleep来控制while的循环周期。
khkly 2012-05-12
  • 打赏
  • 举报
回复
第一条很有可能,我只有等周一去测试不适用using。 适用-->使用 周一使用try catch finally测试一下。
khkly 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

1、using虽然会在结束后自动回收资源,关闭链接。但是在服务器关闭服务时,在函数中间抛出异常,链接不会自动关闭,应该在try...catch...finally中加上conn.Close()。
2、在DefWinProc中每个消息新建的线程中建立一个链接,这样感觉会出问题。如果大量的信息进来,新建太多的线程会占用大量CPU,建立的数据库链接太多,连接池会溢出,就会出现链接不上的问题了。
[/Quote]

第一条很有可能,我只有等周一去测试不适用using。
第二条好像不太成立,现在DefWinProc每5秒new一个thread,在sqlserver正常运行的情况下24+以上winform是正常的,也许是还没达到您说的极限,1秒new一个thread之类的。
showlie 2012-05-12
  • 打赏
  • 举报
回复
1、using虽然会在结束后自动回收资源,关闭链接。但是在服务器关闭服务时,在函数中间抛出异常,链接不会自动关闭,应该在try...catch...finally中加上conn.Close()。
2、在DefWinProc中每个消息新建的线程中建立一个链接,这样感觉会出问题。如果大量的信息进来,新建太多的线程会占用大量CPU,建立的数据库链接太多,连接池会溢出,就会出现链接不上的问题了。
khkly 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这个底层连接是不是COM噢,那个出错记住了,重启电脑 关闭程序 或者清除错误才行吧
[/Quote]

底层?com? 解释解释?
重启电脑或者关闭程序不现实的。
e_board 2012-05-12
  • 打赏
  • 举报
回复
这个底层连接是不是COM噢,那个出错记住了,重启电脑 关闭程序 或者清除错误才行吧
khkly 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Integrated Security=SSPI试试
[/Quote]

数据库服务器和winform在不同的pc上。。
doubleu2005 2012-05-12
  • 打赏
  • 举报
回复
Integrated Security=SSPI试试
khkly 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
重启服务后应该先断开再链接试试
[/Quote]

断开连接? 每次thread都是new SqlConnection 的,还请明示哦?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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