首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“未知JDBC类型代码. at Column.setTypeCode”(DllUtils)

“未知JDBC类型代码. at Column.setTypeCode”(DllUtils)
EN

Stack Overflow用户
提问于 2016-07-19 13:50:02
回答 1查看 1K关注 0票数 1

我正在使用DllUtils,并希望使用它将数据库模式生成为XML文件。有人知道怎么用吗?我正在使用Server进行测试。不确定如何才能将DataSource对象从其中提取出来。我正在阅读http://db.apache.org/ddlutils/api-usage.htmlconnection,我认为我的“模型”名称有问题,但我不知道它到底应该是什么才能得到数据库对象。

代码语言:javascript
复制
public class Main {

public static void main(String[] args) {

    SQLServerDataSource ds = new SQLServerDataSource();
    ds.setDescription("Felix testing program");
    ds.setServerName("localhost");
    ds.setPortNumber(1433);
    ds.setUser("test");
    ds.setPassword("1234");
    ds.setDatabaseName("database");

    try {
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                "org.apache.naming.java.javaURLContextFactory");
        System.setProperty(Context.URL_PKG_PREFIXES, 
                "org.apache.naming"); 

        Hashtable<String, String> pdEnv = new Hashtable<String, String>();
        pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.naming.java.javaURLContextFactory"); 
        pdEnv.put(Context.PROVIDER_URL, "jdbc:sqlserver://localhost:1433");

        Context ctx = new InitialContext(pdEnv);
        ctx.bind("jdbc:sqlserver", ds);
        DataSource ds2 = (DataSource)ctx.lookup("jdbc:sqlserver");

        Database db = readDatabase(ds2);
        writeDatabaseToXML(db, "C:/Users/fcao/Documents/sample.xml");

        readDatabaseFromXML("C:/Users/fcao/Documents/sample.xml");
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

public static Database readDatabaseFromXML(String fileName)
{
    return new DatabaseIO().read(fileName);
}

public static void writeDatabaseToXML(Database db, String fileName)
{
    new DatabaseIO().write(db, fileName);
}

public static Database readDatabase(DataSource dataSource)
{
    Platform platform = PlatformFactory.createNewPlatformInstance(dataSource);

    return platform.readModelFromDatabase("model");
}

public static void changeDatabase(DataSource dataSource,
        Database   targetModel,
        boolean    alterDb)
{
    Platform platform = PlatformFactory.createNewPlatformInstance(dataSource);

    if (alterDb)
    {
        platform.alterTables(targetModel, false);
    }
    else
    {
        platform.createTables(targetModel, true, false);
    }
}

我收到以下错误:

线程"main“中的异常:未知JDBC类型代码-9在org.apache.ddlutils.model.Column.setTypeCode(Column.java:215) at org.apache.ddlutils.platform.JdbcModelReader.readColumn(JdbcModelReader.java:781) at org.apache.ddlutils.platform.mssql.MSSqlModelReader.readColumn(MSSqlModelReader.java:177) at org.apache.ddlutils.platform.JdbcModelReader.readColumns(JdbcModelReader.java:755) at org.apache.ddlutils.platform.JdbcModelReader.readTable(JdbcModelReader.java:565) at org.apache.ddlutils.platform.mssql.MSSqlModelReader.readTable(MSSqlModelReader.java:100) at org.apache.ddlutils.platform.JdbcModelReader.readTables(JdbcModelReader.java:516) at org.apache.ddlutils.platform.JdbcModelReader.getDatabase(JdbcModelReader.java:472) at org.apache.ddlutils.platform.JdbcModelReader.getDatabase(JdbcModelReader.java:432) at org.apache.ddlutils.platform.PlatformImplBase.readModelFromDatabase( org.apache.ddlutils.platform.PlatformImplBase.readModelFromDatabase(PlatformImplBase.java:1869) at com.trillium.io.test.Main.readDatabase(Main.java:...) )Com.trillium.io.test.Main.main(Main.java:.)

对于测试程序,我已经包括了jars: common 0.8 collections 3.2.2Common-lang-2.6 sqljdbc4 -logging-1.2 DdlUtils-1.0 DdlUtils-oro-2.0.1命名-公共-4.1.36共用-消化3-3.2

我试图更改readDatabase方法:

代码语言:javascript
复制
public static Database readDatabase(DataSource dataSource)
{
    Platform platform = PlatformFactory.createNewPlatformInstance(dataSource);

    Database db = null;
    try {
        db = platform.getModelReader().getDatabase(dataSource.getConnection(), "database");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return db;
}

来自https://db.apache.org/ddlutils/api/org/apache/ddlutils/Platform.html#readModelFromDatabase(java.sql.Connection文档。如果我的数据库名是“数据库”,应该是什么名字.

getDatabase 公共数据库getDatabase(Connection connection,String name)抛出SQLException从给定连接读取数据库模型。参数:连接-连接名称-结果数据库的名称;当需要默认名称(目录)时为null,但返回:数据库模型抛出: SQLException。 readModelFromDatabase 数据库readModelFromDatabase(Connection connection,String name)抛出DatabaseOperationException从给定连接指向的活动数据库中读取数据库模型。参数:连接--与数据库名称的连接--结果数据库的名称;当需要默认名称(目录)时为null,但返回:数据库模型抛出: DatabaseOperationException -如果在读取模型时发生错误,则为null。

EN

回答 1

Stack Overflow用户

发布于 2022-09-14 09:47:32

原因是ddlutils不包含nvarchar的类型映射。

我采用以下方法解决了这个问题:首先,使用platform.readModelFromDatabase(名称,databaseName,"dbo",新String[]{"TABLE"});然后,重写org.apache.ddlutils.model.TypeMap如下:在项目中创建类org.apache.ddlutils.model.TypeMap,将所有代码复制到TypeMap中,将以下代码添加到静态块registerJdbcType(-9,"VARCHAR",JdbcTypeCategoryEnum.TEXTUAL);然后它工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38460522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档