论坛首页 Java企业应用论坛

『出错』MS SQL 2000 :驱动不支持指定的SQL类型

浏览 10782 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-31  
软件环境:
eclipse 3.1,MS SQL 2000,windows 2000


配置文件:
ibatis_config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
  	<properties resource="conf/database.properties"/>

	<settings
		cacheModelsEnabled="true"
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		errorTracingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5"
		useStatementNamespaces="false"
	/>

	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property value="${driver}" name="JDBC.Driver"/>
			<property value="${url}" name="JDBC.ConnectionURL"/>
			<property value="${username}" name="JDBC.Username"/>
			<property value="${password}" name="JDBC.Password"/>

			<property value="${MaximumActiveConnections}" name="Pool.MaximumActiveConnections"/>
			<property value="${MaximumIdleConnections}" name="Pool.MaximumIdleConnections" />
			<property value="${MaximumCheckoutTime}" name="Pool.MaximumCheckoutTime"/>
			<property value="${TimeToWait}" name="Pool.TimeToWait" />
			<property value="${PingQuery}" name="Pool.PingQuery" />
			<property value="${PingEnabled}" name="Pool.PingEnabled"/>
			<property value="${PingConnectionsOlderThan}" name="Pool.PingConnectionsOlderThan"/>
			<property value="${PingConnectionsNotUsedFor}" name="Pool.PingConnectionsNotUsedFor"/>			
		</dataSource>
	</transactionManager>
<sqlMap resource="conf/User.xml"/>
</sqlMapConfig>


database.properties
####################################
# Database Connectivity Properties
####################################

driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=iBatis_Test;SelectMethod=Cursor
username=sa
password=

##################
#Pool Properties
##################
MaximumActiveConnections=10
MaximumIdleConnections=5
MaximumCheckoutTime=120000
TimeToWait=500
PingQuery=select 1 from t_user
PingEnabled=false
PingConnectionsOlderThan=1
PingConnectionsNotUsedFor=1

User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="org.ibatis.dm.User"/>
<select id="getUser"
	parameterClass="int"
	resultClass="user">
	<![CDATA[
	select
		name,
		sex
	from t_user
	where id = #id#
	]]>
</select>
<update id="updateUser"
	parameterClass="user">
	<![CDATA[
		UPDATE t_user
		SET
			name=#name#,
			sex=#sex#
		WHERE id = #id#
	]]>
</update>
	<insert id="insertUser"
		parameterClass="user">
		INSERT INTO t_user (
			name,
			sex);
			VALUES (
			#name#,
			#sex#
		);
	</insert>
	<delete id="deleteUser"
		parameterClass="java.lang.String">
		delete from t_user
		where id = #value#
	</delete>
</sqlMap>

错误提示信息:
com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in conf/User.xml. 
--- The error occurred while applying a parameter map. 
--- Check the updateUser-InlineParameterMap. 
--- Check the parameter mapping for the 'id' property. 
--- Cause: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]The specified SQL type is not supported by this driver.
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]The specified SQL type is not supported by this driver.
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:91)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:504)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:68)
at ibatis.dao.UserTestCase.testUpdateUser(UserTestCase.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]The specified SQL type is not supported by this driver.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.validateSqlType(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setObjectInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setNull(Unknown Source)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameter(BasicParameterMap.java:171)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameters(BasicParameterMap.java:125)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:76)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteUpdate(GeneralStatement.java:200)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:78)
... 19 more

Caused by:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]The specified SQL type is not supported by this driver.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.validateSqlType(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setObjectInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setNull(Unknown Source)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameter(BasicParameterMap.java:171)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameters(BasicParameterMap.java:125)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:76)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteUpdate(GeneralStatement.java:200)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:78)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:504)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:68)
at ibatis.dao.UserTestCase.testUpdateUser(UserTestCase.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Caused by:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]The specified SQL type is not supported by this driver.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.validateSqlType(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setObjectInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.setNull(Unknown Source)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameter(BasicParameterMap.java:171)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameters(BasicParameterMap.java:125)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:76)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteUpdate(GeneralStatement.java:200)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:78)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:504)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:68)
at ibatis.dao.UserTestCase.testUpdateUser(UserTestCase.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

你的分析:
这是我的测试过程:
	public void testUpdateUser();{
		try{
			sqlMap.startTransaction();;
			User user = (User);sqlMap.queryForObject("getUser",new Integer(2););;
			assertNotNull(user);;
			
			user.setName("iBatis");;
			sqlMap.update("updateUser",user);;
			
			sqlMap.commitTransaction();;
		}catch(SQLException e);{
			e.printStackTrace();;
		}
		finally{
			try{
				sqlMap.endTransaction();;
			}catch(SQLException e);{
				e.printStackTrace();;
			}
		}				
	}

在更新时(sqlMap.update("updateUser",user);)
就会抛出这个异常,有谁知道这个问题该如何解决?
(google一下,只见提问,好像没见有人做出过正面回答!)
   发表时间:2006-08-31  
不要用ms官方的jdbc驱动,有很多问题的。建议使用jTds
http://jtds.sourceforge.net/
0 请登录后投票
   发表时间:2006-08-31  
谢谢!明白了!

但问题出现了,总得有法解决吧,我用hibernate咋就不出错呢!(我就是见不得"异常"的人,莫怪!莫怪!)

jTDS JDBC Driver先用用试试,谢过了!

这个问题先摆在这儿,知道的朋友说说啊?
0 请登录后投票
   发表时间:2006-09-04  
是不是你的SQLServer没升级到sp4啊
0 请登录后投票
   发表时间:2006-09-04  
-- The error occurred while applying a parameter map.
--- Check the updateUser-InlineParameterMap.
--- Check the parameter mapping for the 'id' property.
0 请登录后投票
   发表时间:2006-09-04  
zelsa 写道
不要用ms官方的jdbc驱动,有很多问题的。建议使用jTds
http://jtds.sourceforge.net/

以前SQL Server 2000 时代M$自己出的JDBC Driver确实很难用,但是现在SQL Server 2005的推出已经改变了这个状态……

大家可以尝试使用一下Microsoft SQL Server 2005 JDBC Driver 1.1,完全向下兼容其他SQL Server版本,速度和性能也有很大的改进。

下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=6D483869-816A-44CB-9787-A866235EFC7C&displaylang=en
0 请登录后投票
   发表时间:2006-09-04  
Allen 写道

以前SQL Server 2000 时代M$自己出的JDBC Driver确实很难用,但是现在SQL Server 2005的推出已经改变了这个状态……

大家可以尝试使用一下Microsoft SQL Server 2005 JDBC Driver 1.1,完全向下兼容其他SQL Server版本,速度和性能也有很大的改进。

下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=6D483869-816A-44CB-9787-A866235EFC7C&displaylang=en

Note The JDBC driver is designed to work on any operating system that supports the use of a Java Virtual Machine (JVM). However, only Sun Solaris, Red Hat Linux, and Windows 2000 or later operating systems are officially supported.
另外,不知道有没有相关的性能(或负载)测试,以前2000的JDBC很难应付高并发的应用,功能也不完善。
0 请登录后投票
   发表时间:2006-09-05  
to IAmOK:我的机器上的SQL 2000已经升级到SP4,不过我现在改用了jTDS JDBC Driver,可以测试了;

Microsoft SQL Server 2005 JDBC Driver 1.1这东西以后再试试!

谢谢各位的帮忙!
0 请登录后投票
   发表时间:2006-09-05  
到SP3就不会有问题了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics