sqlserver2008R2连接数据库异常,异常内容如下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver2008R2连接数据库异常,异常内容如下相关的知识,希望对你有一定的参考价值。

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
所有该打开的服务,全部打开,所有电脑客户端,都能连接上,其中一台客户端之前也能连接上,但是过几天后,就一直连接不上,怎么配置都不能连接上,ping也是没有问题的。调试连接数据库报这个错误。求解!!

参考技术A 最简单的方法,请打开两台机的服务,把所有sqlserver的服务都开了,防火墙例外。就行了 参考技术B 可能是你安装的问题。。。。。追问

数据库安装了一年多了,运行的客户端也有上百个。都没有出现个问题,之前这个客户端也是能用的,就前段时间,不能用。

追答

运行你本地的数据库也不能链接么?

Thrift第四课 连接中断异常处理

场景

Thrift框架采用了异常处理机制,当客户端异常断开连接,服务端这个时候尝试发送数据给客户端,Thrift库会抛出异常,导致进程中断。这种情况是非常正常的,服务器端应该捕获异常的发生,但是不应该异常退出。所以应该当前发送数据失败,直接返回

修改代码如下:

uint32_t TSocket::write_partial(const uint8_t* buf, uint32_t len) {

  if (socket_ == -1) {

 return -1;

    throw TTransportException(TTransportException::NOT_OPEN, "Called write on non-open socket");

  }


  uint32_t sent = 0;


  int flags = 0;

#ifdef MSG_NOSIGNAL

  // Note the use of MSG_NOSIGNAL to suppress SIGPIPE errors, instead we

  // check for the EPIPE return condition and close the socket in that case

  flags |= MSG_NOSIGNAL;

#endif // ifdef MSG_NOSIGNAL


  int b = send(socket_, const_cast_sockopt(buf + sent), len - sent, flags);

  ++g_socket_syscalls;


  if (b < 0) {

    if (errno == EWOULDBLOCK || errno == EAGAIN) {

      return 0;

    }

    // Fail on a send error

    int errno_copy = errno;

    GlobalOutput.perror("TSocket::write_partial() send() " + getSocketInfo(), errno_copy);


    if (errno_copy == EPIPE || errno_copy == ECONNRESET || errno_copy == ENOTCONN) {

//修改的第一个地方,直接返回-1,不抛出异常

      close();

      return -1;

      //throw TTransportException(TTransportException::NOT_OPEN, "write() send()", errno_copy);

    }

//修改的第二个地方,直接返回-1,不抛出异常

close();

return -1;

    throw TTransportException(TTransportException::UNKNOWN, "write() send()", errno_copy);

  }


  // Fail on blocked send

  if (b == 0) {

    throw TTransportException(TTransportException::NOT_OPEN, "Socket send returned 0.");

  }

  return b;

}


如下是新的尝试,尝试在最外层进行异常的捕获

void TSocket::write(const uint8_t* buf, uint32_t len) {

  uint32_t sent = 0;


  while (sent < len) {

//尝试通过try捕获write_partial函数抛出的异常,但是在测试结果中并没有什么用,异常还是中断程序

 try

 {

 uint32_t b = write_partial(buf + sent, len - sent);

 if (b == 0) {

 // This should only happen if the timeout set with SO_SNDTIMEO expired.

 // Raise an exception.

 throw TTransportException(TTransportException::TIMED_OUT,

 "send timeout expired");

 }

 sent += b;

 }

 catch (apache::thrift::transport::TTransportException* e)

 {

 return;

 }

  }

}



分析一下服务器发送数据的函数

void TSocket::write(const uint8_t* buf, uint32_t len) {

  uint32_t sent = 0;


  while (sent < len) {

 uint32_t b = write_partial(buf + sent, len - sent);

 if (b == 0) {

 // This should only happen if the timeout set with SO_SNDTIMEO expired.

 // Raise an exception.

 throw TTransportException(TTransportException::TIMED_OUT,

 "send timeout expired");

 }

 sent += b;

  }

}

但b==0抛出异常,代表当前发送超时。while循环是为了循环发送,因为一次不一定发送完用户数据,毕竟MTU的限制。注意sent是一个无符号整型,当b返回-1的时候,sent==0-1意味着将达到32位整数最大值,大于len,从而直接退出循环。因为套接字已经中断,所以发送失败,在调用write_partial函数的时候,返回b ==-1,导致退出循环,从而避免了抛出异常,因此返回-1,是非常合理的值


以上是关于sqlserver2008R2连接数据库异常,异常内容如下的主要内容,如果未能解决你的问题,请参考以下文章

删除数据库 SQL Server 2008 R2 Express Edition - 异常

SQL Server 2008r2 提交性能问题

安装SQLserver2008R2后Navicat for MySQL连接不上本地数据库

sqlserver2008r2升级到2012的问题

实体框架中 SqlClient 的 SqlServer 2008R2 连接问题

数据库请教:如何在本地连接服务器sqlserver 2008R2?