jdbc连接数据库失败,com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。

本文详细解析了使用SQLServer2005时遇到的数据库连接失败问题,通过指导启用网络协议TCP/IP并重启服务,成功解决了Java应用与SQLServer数据库之间的连接障碍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建数据库连接失败!
com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.mingrisoft.dao.GetConnection.getCon(GetConnection.java:21)
at com.mingrisoft.dao.UserDao.getUser(UserDao.java:11)
at com.mingrisoft.main.Enter$2.actionPerformed(Enter.java:111)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

源代码是:

public class GetConnection {	
private Connection con;			//定义数据库连接类对象
private PreparedStatement pstm;	
private String user="sa";		//连接数据库用户名
private String password="sa";		//连接数据库密码
private String className="com.microsoft.sqlserver.jdbc.SQLServerDriver";	//数据库驱动
private String url="jdbc:sqlserver://localhost:1433;DatabaseName=db_supermarket";		//连接数据库的URL
public GetConnection(){
	try{
		Class.forName(className);
	}catch(ClassNotFoundException e){
		System.out.println("加载数据库驱动失败!");
		e.printStackTrace();
	}
}
/**创建数据库连接*/
public Connection getCon(){
	try {
		con=DriverManager.getConnection(url,user,password);		//获取数据库连接
	} catch (SQLException e) {
		System.out.println("创建数据库连接失败!");
		con=null;
		e.printStackTrace();
	}
	return con;					//返回数据库连接对象
}
解决方法:

安装SQL Server 2005后。在目录下找到SQL Server Configuration Manager这个工具,然后在左边的目录中找到SQL Server 2005网络配置下的MSSQLSERVER,点击后右侧列出了所有协议,找到TCP/IP,发现是禁用状态,启用后再重启MSSQLSERVER服务即可(此步骤必须!),此项可在该工具下的SQL Server 2005服务中找到,或在windows服务中找到。




bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'dbo.tablecgjgl' 无效。 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy63.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) at com.sun.proxy.$Proxy64.getTablexx_flc(Unknown Source) at com.nbheyi.hy_menjin.timer.importRsxxTimer.import_hyc_xx(importRsxxTimer.java:64) at com.nbheyi.hy_menjin.timer.importRsxxTimer.access$100(importRsxxTimer.java:18) at com.nbheyi.hy_menjin.timer.importRsxxTimer$1.run(importRsxxTimer.java:43) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'dbo.tablecgjgl' 无效。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:259) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1547) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:548) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:479) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7344) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2713) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:224) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:204) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:463) at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 11 more
最新发布
08-07
<think>我们遇到了一个新的错误:`bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'dbo.tablecgjgl' 无效。` 这个错误表明,在执行的SQL语句中,引用了名为`dbo.tablecgjgl`的表(或视图等),但数据库中没有这个对象。 可能的原因: 1. 表名错误:可能是表名拼写错误(大小写、空格等),或者表名不正确。 2. 表不存在:该表确实没有被创建,或者已经被删除。 3. 数据库上下文错误:当前连接可能没有在正确的数据库上,导致在该数据库中找不到这个表。 4. 权限问题:当前连接的用户没有访问该表的权限(但错误提示是“无效的对象名”,而不是权限不足,所以可能性较小,但也不能完全排除)。 5. 架构(Schema)问题:表可能不在`dbo`架构下,而是在其他架构下。 解决方案: 1. 验证表名和数据库: - 连接到目标数据库(SQL Server实例中对应的数据库),执行以下查询: ```sql SELECT * FROM information_schema.tables WHERE table_name = 'tablecgjgl' ``` 或者更精确地(指定架构): ```sql SELECT * FROM sys.tables WHERE name = 'tablecgjgl' AND schema_id = SCHEMA_ID('dbo') ``` - 如果查询不到,说明表不存在,需要创建表或者检查表名。 2. 检查当前连接使用的数据库: - 在连接字符串中,通常需要指定数据库名(通过`databaseName`属性)。例如: ```java jdbc:sqlserver://localhost;databaseName=YourDatabase; ``` - 确保连接字符串中的数据库名是正确的。 3. 检查SQL语句: - 查看MyBatis映射文件(如`YiDongMapper.xml`)中,涉及到表`dbo.tablecgjgl`的SQL语句,确认表名是否正确,以及是否使用了正确的架构(`dbo`是默认架构,如果表在其他架构下,需要指定)。 4. 权限问题: - 如果表存在,但当前用户没有访问权限,错误通常是“权限不足”或“拒绝访问”。但这里提示的是“对象名无效”,所以暂时排除。不过为了安全起见,可以检查一下用户权限。 5. 注意大小写敏感性问题: - SQL Server默认是不区分大小写的,但如果数据库设置的是区分大小写,那么表名的大小写必须完全匹配。 6. 临时表问题: - 如果该表是临时表(以`#`或`##`开头),则不能在多用户环境下通过名称直接访问,且临时表只在当前会话存在。但这里表名是`dbo.tablecgjgl`,所以不是临时表。 步骤总结: 1. 确认表`tablecgjgl`是否存在于目标数据库的`dbo`架构下。 2. 确认应用程序连接字符串指定的数据库是否正确。 3. 检查MyBatis映射文件中的SQL语句,确保表名和架构正确。 如果表确实不存在,需要创建表;如果表在另一个架构下,修改SQL语句指定正确的架构(例如`[schema_name].tablecgjgl`)或修改表所属架构。 §§相关问题§§ 1. 如何查询SQL Server中某个表是否存在以及其所属的架构? 2.JDBC连接字符串中指定数据库名称的正确方式是怎样的? 3. SQL Server中对象名无效(Invalid object name)错误通常由哪些原因引起? 4. 如何修改SQL Server中现有表的架构(schema)? 5. 在MyBatis的XML映射文件中,如何正确引用不同架构(schema)下的表?</think>### 错误分析:对象名 'dbo.tablecgjgl' 无效 此错误表示 SQL Server 无法找到指定的表或视图。核心问题是 **数据库对象不存在或不可访问**,可能原因包括: 1. **表名拼写错误** `tablecgjgl` 可能拼写错误(如大小写不一致或缺少字符) 2. **架构问题** 表实际不在 `dbo` 架构下(如 `schema1.tablecgjgl`) 3. **数据库上下文错误** 连接字符串未指定正确数据库,导致在 `master` 等系统库中查表 4. **权限不足** 当前数据库用户无 `SELECT` 权限 5. **延迟创建/同步问题** 表刚创建但未提交,或主从同步延迟 --- ### 解决方案 #### 第一步:验证对象是否存在 ```sql -- 检查表是否存在(精确匹配) SELECT * FROM sys.objects WHERE name = 'tablecgjgl' AND type_desc = 'USER_TABLE' -- 检查架构和表名组合 SELECT s.name AS schema_name, t.name AS table_name FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name LIKE '%cgjgl%' -- 模糊匹配 ``` #### 第二步:修复措施 1. **修正SQL语句** 确保MyBatis映射文件(如 `YiDongMapper.xml`)使用正确表名: ```xml <!-- 错误示例 --> <select id="getTablexx_flc" resultType="map"> SELECT * FROM dbo.tablecgjgl <!-- 需修正 --> </select> <!-- 正确示例(假设实际表名为 dbo.t_cgjgl)--> <select id="getTablexx_flc" resultType="map"> SELECT * FROM dbo.t_cgjgl </select> ``` 2. **指定数据库上下文** 在连接字符串中强制指定数据库: ```java // 原连接字符串可能缺失数据库jdbc:sqlserver://host:1433;databaseName=YourActualDB; ``` 3. **授权访问权限** 在SQL Server执行: ```sql USE YourActualDB; GRANT SELECT ON dbo.t_cgjgl TO YourAppUser; ``` 4. **处理跨架构对象** 若表在自定义架构下(如 `hr`): ```sql SELECT * FROM hr.t_cgjgl -- 非dbo架构需显式声明 ``` --- ### 关键排查点 | 检查项 | 命令/方法 | |------------------|-----------------------------------| | 表是否存在 | `SELECT * FROM sys.tables WHERE name LIKE '%cgjgl%'` | | 实际表名 | 在SSMS中展开目标数据库的"表"节点 | | 用户权限 | `EXEC sp_helprotect @username='YourAppUser'` | | 连接字符串 | 检查`spring.datasource.url`配置 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值