我用C# winform 做了一个实时的检测系统,其中用timer控件,在timer1_Tick的事件中每隔2秒执行很多SQL语句,timeout事件我设置了3秒。
我把sql语句的执行情况插入到一个日志表中,昨天检测了一天一夜,今天回公司看日志的时候,发现错误信息。在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。)这样的错误。况且发生这样的情况很多次。请问我该怎么解决这样的问题。

解决方案 »

  1.   

    应该是检测系统传输数据发生问题,可以试试一下办法
    1,加快接收检测数据速度,有数据传输就及时接收到缓冲区,可以先不处理。
    2,sql语句执行时间尽量快,数据可以先插入临时表,等空闲时处理。
      

  2.   

    数据的传输数量是很少的,因为要检测100多个表,并且每个表都需要有多个检测时间段,所以我要判断当前时间是否在时间段内,是 就查询表的相应记录 否 就直接跳过。判断当前时间是否在时间段内的语句select count(PKID) from jcAlarm where ( 1=1  and  datepart(dw,getdate()) -1 in (1,2,3,4,5) and  Convert(datetime,'2009-06-04 '+Convert(varchar(2),datepart(hh,getdate()))+':'  +Convert(varchar(2),datepart(mi,getdate()))+':'+Convert(varchar(2),datepart(ss,getdate())))   between  '2009-6-4 14:15:00' and '2009-6-4 14:45:59')   就发生在这个语句上。1楼大哥,数据传输量很少的。
      

  3.   

    select count(PKID) from jcAlarm where ( 1=1  and  datepart(dw,getdate()) -1 in (1,2,3,4,5) and  Convert(datetime,'2009-06-04 '+Convert(varchar(2),datepart(hh,getdate()))+':'  +Convert(varchar(2),datepart(mi,getdate()))+':'+Convert(varchar(2),datepart(ss,getdate())))  between  '2009-6-4 14:15:00' and '2009-6-4 14:45:59')
    我这个语句能不能简化一下,是不是有点复杂,但是我又想不出来别的方法。功能就是:检查当前时间是不是在设定的between  '2009-6-4 14:15:00' and '2009-6-4 14:45:59'范围之内。因为这样的语句要两秒之内要执行100多次。是不是效率低的缘故?很急
      

  4.   

    windows socket error: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作(10055),on API connect 解决方法: 1、重启电脑,最简单方法。 2、虚拟内存太小或者C盘满了。如果是这种,请加大虚拟内存量,并保证C盘还有充足的空间。 如果是这种,右键单击我的电脑——>属性——>高级——>性能设置——>高级——>将虚拟内存的值加大。 3、开始-运行依次输入以下命令,输完这些命令后重新启动windows,然后打开IE看看。 regsvr32 Shdocvw.dll 
    regsvr32 Shell32.dll 
    regsvr32 Oleaut32.dll 
    regsvr32 Actxprxy.dll 
    regsvr32 Mshtml.dll 
    regsvr32 Urlmon.dll 4、是你电脑里面某个软件的问题。 
        这个错误可能是你计算机的Socket句柄资源用尽导致的,能够造成这种现象的一种情况就是你的计算机的某个程序不断的向某个连接发出连接申请,但是始终没能连上,没连上就会引发一个错误,如果软件编程的人没有写释放资源的代码,那么这个连接就始终占据着着一个句柄,于是由于不断的连接,最终导致Socket句柄资源耗尽。 5、注册表中的以下二项出现错误 
        HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Winsock 
        HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Winsock2 
    解决办法:备份,然后找一台相同系统的机器,将以下注册表分支导出存为二个文件,  
        HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Winsock 
          HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Winsock2 最后将这二个导出的注册表文件导入到有问题的机器中即可。 6、运行Hijackthis,选择do a system Scan only,在下列选项前打上勾,然后关闭其他程序和IE窗口,点“Fix Checked”,出现提示时一路点“是”让它继续: 
    O23 - Service: IEXPLORER - Unknown - C:\\WINNT\\IEXPLORER.exe  灰鸽子 重启电脑按F8进安全模式,打开我的电脑 工具 文件夹选项 查看 设置windows显示所有隐藏文件、受保护的系统文件和文件夹,然后手动删除:C:\\WINNT\\IEXPLORER.exe 及同一时间生成的.DLL文件。 
      

  5.   

    这个错误可能是你计算机的Socket句柄资源用尽导致的,能够造成这种现象的一种情况就是你的计算机的某个程序不断的向某个连接发出连接申请,但是始终没能连上,没连上就会引发一个错误,如果软件编程的人没有写释放资源的代码,那么这个连接就始终占据着着一个句柄,于是由于不断的连接,最终导致Socket句柄资源耗尽。检测系统本来就是不能检测这100多个表的。当每个表在检测时间范围内有数据变化时,就要提示用户的。这些就是不停的连接到后台数据库的。6楼大哥提到Socket句柄。那么怎么才能释放Socket句柄呀。
      

  6.   

    今天布属web程序发现报这个错误:在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: TCP 提供程序, error: 0 - 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。)
    看上去是由于系统的socket缓冲池被占完了。。
    打开任务管理器->进程->菜单中“查看”->选择列->将“句柄计数”选中 然后看看哪些进程的句柄数居高不下,再将对应进程关掉(有进程上万个句柄,那肯定出错了) 然后,再试试看操作成不成功。 这个错误一般是系统的句柄资源/还是内存(不太记得)给占光而导致的。我以前也遇到。