Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让Velocity使用Microsoft JDBC驱动程序从数据源检索模板?_Java_Sql Server_Jdbc_Velocity - Fatal编程技术网

Java 如何让Velocity使用Microsoft JDBC驱动程序从数据源检索模板?

Java 如何让Velocity使用Microsoft JDBC驱动程序从数据源检索模板?,java,sql-server,jdbc,velocity,Java,Sql Server,Jdbc,Velocity,我的Java应用程序以前使用Sourceforge jTds驱动程序针对SQL Server数据库运行。它能够使用ApacheVelocity引擎(v2.0)从数据库中的varchar(max)列检索模板。现在数据库将被加密,这样JTDS就不再工作了——甚至连连接都不会成功。我已经用MicrosoftJDBC驱动程序(mssql-JDBC-7.2.2.jre8)替换了它。由于以下错误,Velocity资源加载程序无法找到任何资源: com.microsoft.sqlserver.jdbc.SQL

我的Java应用程序以前使用Sourceforge jTds驱动程序针对SQL Server数据库运行。它能够使用ApacheVelocity引擎(v2.0)从数据库中的
varchar(max)
列检索模板。现在数据库将被加密,这样JTDS就不再工作了——甚至连连接都不会成功。我已经用MicrosoftJDBC驱动程序(mssql-JDBC-7.2.2.jre8)替换了它。由于以下错误,Velocity资源加载程序无法找到任何资源:

com.microsoft.sqlserver.jdbc.SQLServerException:从 不支持varchar到BinaryStream

已尝试将列类型更改为文本。同样的错误。尝试更改为图像。然后Velocity显然找到了资源,但返回的模板是空的


是否有人在Velocity和Microsoft JDBC方面遇到类似问题?

您可以配置Velocity以使用自己的数据源资源加载程序:

package com.foo;

import org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader;

import java.io.Reader;
import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MyDataSourceResourceLoader extends DataSourceResourceLoader
{
    /**
     * Gets a reader from a result set's column
     * @param resultSet
     * @param column
     * @param encoding
     * @return reader
     * @throws SQLException
     */
    protected Reader getReader(ResultSet resultSet, String column, String encoding)
        throws SQLException
    {
        return new StringReader(resultSet.getString(column));
    }
}
编码没有被检查,因此它们应该在应用程序和数据库之间保持一致

然后,通过设置以下配置属性,告诉Velocity使用资源加载器:

resource.loaders = ds
resource.loader.ds.class = com.foo.MyDataSourceResource

谢谢你的回复。这当然是有道理的。但是,我正在查看的DataSourceSourceLoader类没有要重写的getReader()方法。我可以问一下你假设的速度是哪个版本吗?我使用的是1.7(很抱歉,我最初没有指定它)。无论如何,您让我走上了解决方案的道路,所以我感谢您。@RobertNoble您在问题中说:“它能够使用Apache Velocity引擎(v2.0)”。。。在1.7中,您必须重写
公共同步InputStream getResourceStream(最终字符串名称)抛出ResourceNotFoundException方法。