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

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




org.jkiss.dbeaver.model.sql.DBSQLException: SQL 错误 [156] [S0001]: 关键字 'where' 附近有语法错误。 at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:577) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$1(SQLQueryJob.java:486) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:173) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:493) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:894) at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3726) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:123) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:173) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:121) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:4982) at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'where' 附近有语法错误。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632) at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:872) at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:767) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7418) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3274) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222) at com.microsoft.sqlserver.jdbc.SQLServerStatement.execute(SQLServerStatement.java:743) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:329) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.lambda$0(JDBCStatementImpl.java:131) at org.jkiss.dbeaver.utils.SecurityManagerUtils.wrapDriverActions(SecurityManagerUtils.java:96) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:131) ... 12 more
最新发布
11-23
<think> 我们正在解决SQL查询中出现“关键字'where'附近有语法错误”的问题。根据引用[1]和[2],该错误通常是由于SQL语句的语法错误引起的。引用[1]中提到了在JDBC连接SQLServer时更新表内容出现的错误,引用[2]则是在MyBatis查询中由于SQL语句错误导致的。错误信息都指向了WHERE关键字附近的语法问题。 常见原因: 1. WHERE子句前的部分存在语法错误,比如缺少逗号、括号不匹配、表名或列名错误等。 2. 在WHERE子句中使用了保留关键字作为列名或表名,且没有用方括号或引号分隔。 3. 在动态生成SQL时,WHERE子句前的部分拼接错误,比如多了一个逗号或者少了某个部分。 根据引用[3],还应注意日期格式的问题,因为不同的语言/日期格式设置可能导致日期字符串被错误解析,从而引发语法错误。 针对用户的问题,错误信息为:SQL错误[156][S0001]关键字'where'附近有语法错误。 解决步骤: 1. 检查整个SQL语句,特别是WHERE关键字前面的部分。确保表名、列名正确,且使用了正确的分隔符(如逗号分隔列名,但WHERE前不应有逗号)。 2. 检查是否在WHERE子句前遗漏了必要的部分,比如在UPDATE语句中,WHERE之前应该有一个SET子句,并且SET子句中的赋值语句要正确。 3. 检查是否将SQL保留关键字用作表名或列名。在SQL Server中,如果使用了保留关键字,必须用方括号[]括起来。例如,如果有一个表名为"user",则必须写成`[user]`,因为"user"是保留字(如引用[2]所示)。 4. 检查动态SQL的拼接,确保没有在WHERE前面多出或缺少某些字符(比如多余的逗号、括号不匹配等)。 5. 如果使用了动态参数(如MyBatis中的#{}),确保参数传递正确,没有在SQL语句中留下不完整的占位符。 6. 检查日期等字面量的格式,确保它们符合SQL Server的日期格式要求,或者使用参数化查询以避免格式问题。 示例:引用[2]中,查询语句为:`select * from user where id = ?`,这里"user"是保留字,应该改为`select * from [user] where id = ?`。 因此,针对用户当前的错误,我们首先需要检查SQL语句中WHERE关键字前面的部分。请提供具体的SQL语句以便进一步分析。 如果用户没有提供具体的SQL语句,我们可以按照以下步骤自行检查: 假设一条有问题的SQL: ```sql SELECT * FROM table WHERE condition; ``` 如果表名`table`是保留字,则需要改为: ```sql SELECT * FROM [table] WHERE condition; ``` 或者,在UPDATE语句中: ```sql UPDATE table SET col1 = value1, WHERE col2 = value2; -- 错误,SET子句后多了一个逗号 ``` 应该去掉逗号: ```sql UPDATE table SET col1 = value1 WHERE col2 = value2; ``` 另外,检查条件表达式是否正确,比如条件中是否缺少操作符,或者使用了不正确的运算符。 如果用户能够提供具体的SQL语句,我们可以更准确地定位问题。 由于用户没有提供具体的SQL语句,我们只能给出一般性的建议。 因此,建议用户: 1. 检查并确保WHERE关键字前面的SQL语句部分(如SELECT、FROM、UPDATE、SET等)正确无误。 2. 将任何可能是保留关键字的表名或列名用方括号[]括起来。 3. 检查SQL语句中括号的匹配,确保没有未闭合的括号。 4. 检查是否在WHERE子句前出现了多余的逗号或其他符号。 如果用户使用的是动态SQL(如在Java代码中拼接),请检查拼接后的完整SQL语句,确保语法正确。 另外,引用[3]提醒我们注意日期格式问题,如果WHERE子句中有日期条件,应使用标准格式(如'YYYYMMDD'或'YYYY-MM-DD'),或者使用参数化查询。 示例:避免使用本地化的日期格式,如'12/31/2023',而使用'2023-12-31'(注意:在SQL Server中,使用`CONVERT`或`CAST`确保格式正确,或者使用参数化查询)。 如果用户提供了具体的SQL语句,我们可以进一步分析。 由于当前错误信息是“关键字'where'附近有语法错误”,我们重点检查WHERE前面的部分。 常见错误示例: 错误1:在WHERE前多了一个逗号 ```sql SELECT col1, col2, FROM table WHERE col1 = 1; -- 这里col2后面的逗号是多余的,因为后面没有其他列,然后紧接着是FROM,但这里会导致错误,因为FROM前面不应该有逗号。 ``` 错误2:使用了保留字未加方括号 ```sql SELECT * FROM order WHERE id = 1; -- order是保留字 ``` 应改为: ```sql SELECT * FROM [order] WHERE id = 1; ``` 错误3:子查询中的错误 ```sql SELECT col1 FROM (SELECT col1 FROM table) WHERE col1 = 1; ``` 如果子查询没有别名,在某些情况下可能出错(在SQL Server中,子查询必须指定别名): ```sql SELECT col1 FROM (SELECT col1 FROM table) AS t WHERE col1 = 1; ``` 错误4:在WHERE子句中使用了不正确的表达式 ```sql SELECT col1 FROM table WHERE col1 =; -- 缺少值 ``` 根据这些常见错误,请用户检查自己的SQL语句。 如果用户无法提供SQL语句,我们只能建议按照上述步骤检查。 最后,建议在SQL Server Management Studio中运行该语句,看是否报错,并查看具体的错误位置(通常错误信息会指向具体的行和列)。 如果问题仍然存在,请提供具体的SQL语句以便进一步分析。 </think> ## 解决 SQL 查询中 "关键字 'where' 附近有语法错误" 的问题 当 SQL Server 抛出错误 `SQL 错误 [156] [S0001] 关键字 'where' 附近有语法错误` 时,通常表示 WHERE 子句前的 SQL 语句部分存在语法问题。以下是常见原因和解决方案: ### 常见原因及解决方案 #### 1. **WHERE 子句前缺少必要部分** [^1] ```sql -- 错误示例 SELECT * WHERE id = 1 -- 缺少 FROM 子句 -- 正确写法 SELECT * FROM [表名] WHERE id = 1 ``` #### 2. **表名/列名使用 SQL 保留字未加分隔符** ```sql -- 错误示例 SELECT * FROM user WHERE id = 1 -- "user" 是保留字 -- 正确写法 (使用 [ ] 分隔) SELECT * FROM [user] WHERE id = 1 ``` #### 3. **JOIN 语句错误** ```sql -- 错误示例 SELECT * FROM table1 JOIN table2 WHERE table1.id = table2.id -- 缺少 ON 子句 -- 正确写法 SELECT * FROM table1 JOIN table2 ON table1.id = table2.id ``` #### 4. **子查询括号错误** ```sql -- 错误示例 SELECT * FROM (SELECT id, name FROM users WHERE id > 100 -- 缺少子查询结束括号 ``` #### 5. **CASE 语句未正确结束** ```sql -- 错误示例 SELECT CASE WHEN score > 90 THEN 'A' ELSE 'B' WHERE score IS NOT NULL -- 缺少 END 关键字 -- 正确写法 SELECT CASE WHEN score > 90 THEN 'A' ELSE 'B' END AS grade FROM scores WHERE score IS NOT NULL ``` ### 调试步骤 1. **简化查询**: ```sql -- 只保留基本结构 SELECT * FROM [表名] WHERE 1=1 ``` 2. **逐步添加元素**: ```sql -- 步骤1:验证表名 SELECT TOP 1 * FROM [表名] -- 步骤2:添加条件 SELECT TOP 1 * FROM [表名] WHERE [主键列] = 1 -- 步骤3:添加JOIN/其他子句 ``` 3. **检查保留字**: ```sql -- 列出所有使用保留字的对象 SELECT name FROM sys.all_objects WHERE name IN ('user','table','date','level') -- 常见保留字 ``` 4. **验证日期格式** [^3]: ```sql -- 使用安全格式 WHERE date_column = '20231231' -- ISO格式 WHERE date_column = '2023-12-31' -- ANSI格式 ``` ### SQL Server 常见保留字 | 保留字 | 替代写法 | 保留字 | 替代写法 | |--------|----------|--------|----------| | user | [user] | level | [level] | | table | [table] | date | [date] | | order | [order] | group | [group] | | key | [key] | value | [value] | ### 预防措施 1. 始终使用方括号 `[]` 包裹表名和列名 2. 使用参数化查询防止 SQL 注入 ```sql -- .NET 示例 SqlCommand cmd = new SqlCommand("SELECT * FROM [users] WHERE id = @id"); cmd.Parameters.AddWithValue("@id", userId); ``` 3. 使用专业 SQL 客户端(如 SSMS)的语法高亮和错误提示功能 通过以上方法,可解决 90% 以上的 "关键字 'where' 附近有语法错误" 问题。如果仍无法解决,建议提供具体查询语句进一步分析。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值