数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。相关的知识,希望对你有一定的参考价值。
请问怎么办,怎没修改啊!
datetime2012-12-11 00:00:00
你在界面直接输入输入修改的话,遵循这种格式应该可以
如果程序里面你写或者SQL语句,20121211 15:06:17
需要这么cast('20121211 15:06:17' as datetime) 强转一下类型就好了
你要用convert强转的话 convert(datetime(8),'20121211 15:06:17',105)第三个参数指定的日期输出风格,要什么风格,自己查了改了 参考技术A 有些数据类型是支持隐式转换的如:int 和decimal ,可以隐式转换的在使用时可以不用显示转换直接使用,如字段col1 是decimal 数据类型 ,col2 是int 类型 则可以col1 = col2 ,数据库计算时会自己转换.
有些是不能隐式转换的,如varchar和money,需要用显示的转换函数来转换
如convert(money,col1) 或cast (col1 as money) 参考技术B 那是因为你有一列的内容本来是时间,让你给改成数字了,所以不允许保存,因为数据类型错误
好好查一下。追问
我的列里面没有数据是空类容
参考技术C 字符串长度超出了数据库定义的长度了,就这样 参考技术D 请详细的讲一下,你是在进行什么的时候出现了这个问题?Spring JDBC for SQL Server - 使用 SQLXML 数据类型产生 SQLServerException:不允许从数据类型 xml 到 nvarchar(max) 的隐式转换
【中文标题】Spring JDBC for SQL Server - 使用 SQLXML 数据类型产生 SQLServerException:不允许从数据类型 xml 到 nvarchar(max) 的隐式转换【英文标题】:Spring JDBC for SQL Server - Using SQLXML datatypes yields SQLServerException: Implicit conversion from data type xml to nvarchar(max) is not allowed 【发布时间】:2013-05-24 15:48:19 【问题描述】:我正在尝试根据 Spring 3.2 文档 (http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/jdbc.html) 中的此示例,使用 Spring SimpleJdbcCall 使用 XML 输入/输出参数的 SQL Server 存储过程:
public class JdbcActorDao implements ActorDao
private JdbcTemplate jdbcTemplate;
private SimpleJdbcCall procReadActor;
public void setDataSource(DataSource dataSource)
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.procReadActor =
new SimpleJdbcCall(dataSource)
.withProcedureName("read_actor");
public Actor readActor(Long id)
SqlParameterSource in = new MapSqlParameterSource()
.addValue("in_id", id);
Map out = procReadActor.execute(in);
Actor actor = new Actor();
actor.setId(id);
actor.setFirstName((String) out.get("out_first_name"));
actor.setLastName((String) out.get("out_last_name"));
actor.setBirthDate((Date) out.get("out_birth_date"));
return actor;
// ... additional methods
我的实现是这样的:
@Repository
public class ObjectDao
private JdbcTemplate jdbcTemplate;
@Value("$db.sp.getObject")
private String spName;
private SimpleJdbcCall jdbcCall;
@Autowired
public void setDataSource(DataSource dataSource)
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.jdbcCall=
new SimpleJdbcCall(dataSource)
.withProcedureName(spName);
public SQLXML getDbObjectById(Integer id)
SqlParameterSource in = new MapSqlParameterSource()
.addValue("objectId", id, Types.INTEGER);
Map<String, Object> out = jdbcCall.execute(in);
return (SQLXML) out.get("OutputXML");
我已经用其他数据库事务测试了连接参数,并且这些都成功了,但是当尝试读取使用 XML 变量的输出参数时,我会看到如下所示的 BadSqlGrammarException
EXECEPTION
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
ROOT CAUSE
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [call spXML_Wrapper(?, ?, ?)]; nested exception is c om .microsoft.sqlserver.jdbc.SQLServerException: Implicit conversion from data type xml to nvarchar(max) is not allowed. Use the CONVERT function to run this query.
org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1036)
org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1070)
org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:387)
org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:350)
org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181)
com.test.dao.ObjectDao.getDbObjectById(InvoiceDaoImpl.java:59)
........
ROOT CAUSE
com.microsoft.sqlserver.jdbc.SQLServerException: Implicit conversion from data type xml to nvarchar(max) is not allowed. Use the CONVERT function to run this query.
com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332)
org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)
org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)
org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1072)
org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1070)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1020)
org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1070)
org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:387)
org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:350)
org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181)
com.test.dao.ObjectDao.getDbObjectById(InvoiceDaoImpl.java:59)
.......
我检查了存储过程本身是否符合要求 - 执行良好。对于使用 Spring 框架从存储过程中读取 XML 输出,是否有人有过此类错误的经验或有任何替代建议?
其他信息:
春季 3.2
Tomcat 7.0
Microsoft JDBC Driver 4.0 for SQL Server
感谢您的帮助
【问题讨论】:
【参考方案1】:我没有查过这个,所以这只是一个理论,但我的猜测是 SQL Server JDBC 驱动程序使用的 XML 类型没有使用java.sql.Types
中使用的标准数据类型值。
我要做的是编写一个简单的独立 JDBC 程序,该程序打印存储过程返回的数据类型的 ResultSetMetaData.getColumnType()
值。如果该整数未在java.sql.Types
中列出,那么很可能 Spring 将其默认为字符串值,您必须找到一种方法来覆盖它处理数据类型推断的方式。
我认为您无法使用 SimpleJdbcCall 完成此任务;不幸的是,我认为您将不得不退回到使用 JdbcTemplate。 Spring 对存储过程中数据类型的处理似乎非常有限。
【讨论】:
谢谢。最后,我按照您的建议做了并恢复为 JdbcTemplate;不那么优雅,但更实用。以上是关于数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。的主要内容,如果未能解决你的问题,请参考以下文章
不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换
无法在 varbinary(max) 中插入空值并出现错误:不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换