DB相关问题

一、无法连接到SQL数据库

问题:连接到服务器------------------------------无法连接到 .。

  其他信息:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 

解决:

  心想应该是服务中有什么没开启的,果然SQL Server(MSSQLSERVER)未开启,而且碰到开启出错的情况,后来就搜解决方案,将“Microsoft SQL Server 2012 Express LocalDB”卸载。再开启,成功。之后就可连接数据库了。

原因:

  可能是这台电脑之前安装了 visual studio 2012,内置的SQl server 2012与之冲突,导致新的2008 R2 版本过低导致。

二、运用EF 部署在服务器中报错:基础提供程序在 Open 上失败

  可能是web.config中的数据库连接字符串有问题。检查下以下节点:

<connectionStrings>
    <add name="bj_gsdsEntities" connectionString="metadata=res://*/EF.CardInfoModel.csdl|res://*/EF.CardInfoModel.ssdl|res://*/EF.CardInfoModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=bj_gsds;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>
  </connectionStrings>

或者是

iPersist Security Info=True;User ID=sa;Password=xxxx;

三、用Navicat连接sqlserver报错:要连接到sql server,您需要安装sql server native client

  解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

 

   局域网内连接时,可查看所有安装了数据库的服务器

 

四、修改表设计后,保存报错:不允许保存更改

解决方法:

工具-》选项,取消“阻止保存要求重新创建表的更改”复选框

是因为SQL Server为了防止数据表被随意更改,默认在创建后不允许更改表的结构。

五、仅当使用了列列表并且 IDENTITY_INSERT ON 时,才能为表'XXX中的标识列指定显式值

  在进行数据插入时,如果插入列名包括标识列(自增长),如果要显示的指定其值,可能报错

解决:标识列(自动编号)

SET IDENTITY_INSERT TABLE_NAME ON;
INSERT INTO TABLE_NAME(XXX, XXX,..., XXX) SELECT XXX, XXX,..., XXX FROM TABLE_NAME_BAK;
--注意: 即使是所有列,这里的字段名(标识列)也不能省略.
SET IDENTITY_INSERT TABLE_NAME OFF;

1、要对数据表的标识列执行插入操作进,先要设置该数据表identity_insert为on;同时要列出些标识列(当然,同时也就需要列出相关的其他列了);

2、每一次连接会话中的任一时刻,只能对一个表设置IDENTITY_INSERT ON,且设置只对当前会话有效。

六、SqlConnection连接释放的说明

  • close()与Dispose()  

Close方法关闭了连接;Dispose方法调用了Close方法,同时清空了连接字符串

using表示在{}区间后,自动调用Dispose方法,保证对象被销毁。 using只能用在继承了IDispose接口的类上

所以,调用Close方法后还可以调用Open方法打开连接。调用Dispose方法后就不能再打开了,因为connectionstring清空了,会抛出InvalidOperationException,但是给连接字符串重新赋值后就又能打开了

也就是说Dispose方法和Close方法都没有释放Connection对象。

  • 连接池的作用:

Connection对象在调用Close或者Dispose方法之后就会进入到连接池。当再次用到与这个Connection对象拥有相同的连接字符串的连接对象时就会从这个连接池中取出这个Connection对象,而不是重新创建一个。

  • 连接池创建和分配:

创建第一个Connection对象并打开连接时就会创建一个连接池。连接池与连接字符串完全匹配,如果以后的的Connection对象的连接字符串与某一个连接池的完全匹配就会把这个Connection对象放入到相应的连接池中,否则就会创建一个新的连接池。

  • 添加连接:

连接池是为每个唯一的连接字符串创建的。 当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。 连接根据需要添加到池中,但是不能超过指定的最大池大小(默认值为 100)。 连接在关闭或断开时释放回池中。

由此得出的结论是:不管是dispose还是close都不会销毁对象,即不会释放内存,它们会把sqlconnection对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是connection timeout设置的时间内,如果程序中没有向连接池发出请求说要connection对象,sqlconnection对象便会销毁,这也是连接池存在的意义。

七、Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126

在使用SQL2005(或2008)是可能会遇到错误提示:

“Windows不能在本地计算机启动SQL Server。有关更多信息,查阅系统事件日志。如果这是非Microsoft服务,请与服务厂商联系,并参考特定服务错误代码126 ”

解决方法:

  在2005(2008)的“配置工具”中有个“SQL Server Configuration Manager”-->SQLserver 2005(2008) 的网络配置,

查看MSSOLSERVER和SQLEXPRESS中都有个VIA的属性,将VIA设置为禁用,然后重启服务,就可以了,服务能正常启动。

原文地址:https://www.cnblogs.com/peterYong/p/6556545.html