gpt4 book ai didi

java - 在java客户端中更改derbyDB架构 'on the fly'

转载 作者:行者123 更新时间:2023-12-01 05:11:40 25 4
gpt4 key购买 nike

我的应用程序中有一个嵌入式 derbyDB,我目前正在测试我的代码。

如果我发送以下 SQL 代码

set current schema  [newSchemaName];

从 ij 然后我可以设置架构和来自数据库的响应

show tables;

将仅报告先前标识的 newSchemaName 中存在的表(尽管这似乎并不总是有效!)

如果我从 java 代码中执行类似的操作,然后执行

getCurrentConection.getSchema();

从上面返回的值永远不会建议在 SQL 中传递的 newSchemaName(尽管如果我使用准备好的语句,它会按预期返回 newSchemaName)。

这是一些额外的背景信息...

我有默认数据库名称“derbyTest”并创建了 3 个其他架构。行政S1S2从逻辑上分离/隐藏用户不需要知道的信息

我需要在操作期间更改架构(例如:如果需要查看更多“微妙”信息,管理员将更改架构)。

为此,我创建了一个 setSchema(String newSchemaName) 方法,该方法创建架构(如果尚不存在)然后连接到它。

但是运行代码片段后

/**
*method to change to a given schema
*@param newSchemaName the new schema to change to
/
public void SetSchema(String newSchemaName){

String sql = newSchemaName.toUpperCase();//make sure the newSchemaName is in upper case.

ResultSet rs;
try
{
rs = this.sendQry("select schemaName from sys.sysschemas where schemaname = '" + sql + "'");//does this schema exist in the DB
if (rs.next())
{//the schema already exists
//send some messages to the user about the change of schema
errLog.setDevError(1, "derbyDB schema" +sql +" already exists ");
errLog.add(2, "connecting to " + sql);
//next line create the SQL for changing to the newSchemaName supplied
this.sendSQL("set current schema " + sql);//connect to the schema
//log a message to display the current schema in the DB
//this next log never shows a change to the newSchemaName unless
//I use a prepared statement in my java code.
errLog.add(1, "current DB schema is " + getCurrentConection.getSchema();
}
else{//the schema does not exist
//send a message to the user and output log
errLog.setDevError(1, "derbyDB schema" +sql +" does not exist ");
//code to send message asking if user wants to create the new schema....
}

}//end try
catch{
//catch errors


}
}//end method

如果我查看文档 http://db.apache.org/derby/docs/dev/ref/rrefsqlj32268.html对于设置模式,我的 SQL 是正确的,如果我直接从 ij 运行,代码就可以工作。

我知道ij和客户端有一些区别(describe等功能在客户端不起作用,你需要用元数据来代替)。

set schema 语句的情况是否相同?或者这仅适用于我即将测试的准备好的语句。

如果是这样,这就引出了一个问题:为什么我只能从准备好的语句中更改架构?

想法和评论被广泛接受。

大卫

编辑:准备好的语句用于更改模式。所以现在只剩下第二个问题了。为什么准备好的语句和正常语句之间存在差异...我认为谷歌是时候了?

编辑:我不知道这是否会产生影响,但我在 Windows 平台上,使用标准 JDK (6),并且 eclipse indigo 在 eclipse 内运行 jUnit 测试。我还可以在 Linux(ubuntu) 上使用 opendJDK 进行测试,是否有助于排除故障。

最佳答案

我不确定你的问题是什么。

您可以在表引用中显式指定架构,如下所示:

SELECT * FROM S1.TABLE_NAME

UPDATE S2.TABLE_NAME SET COL1=VALUE1

等等

或者,如果您愿意,您可以从表引用中省略架构名称,仅表示:

SELECT * FROM TABLE_NAME

UPDATE TABLE_NAME SET COL1=VALUE1

等,在这种情况下,您将需要通过发出 SET SCHEMA 语句或使用现有的默认架构来为这些语句建立隐式架构,该默认架构与您登录时的用户名相匹配。

我认为您关于准备好的语句与非准备好的语句的问题与以下事实有关:如果您没有指定显式架构,则在准备语句时会建立默认的架构名称。

如果是我,并且我关心我使用的模式,我会在所有 SQL 语句的所有表引用中显式指定模式,然后我会确定何时使用哪个模式。

关于java - 在java客户端中更改derbyDB架构 'on the fly',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com