我在我的应用程序中嵌入了 derbyDB,我目前正在测试我的代码。
如果我发送以下 SQL 代码
set current schema [newSchemaName];
从 ij 然后我可以设置模式和来自数据库的响应
show tables;
将仅报告先前确定的 newSchemaName 中存在的表(尽管这似乎并不总是有效!)
如果我从 java 代码做类似的事情,然后执行
getCurrentConection.getSchema();
从上面返回的值从不建议在 SQL 中传递 newSchemaName(尽管如果我使用准备好的语句,它会按预期返回 newSchemaName)。
这是一些额外的背景信息...
我有默认数据库名称“derbyTest”并创建了 3 个其他模式。管理员 S1 S2 从逻辑上分离/隐藏用户不需要知道的信息
我需要在操作期间更改架构(例如:如果需要查看更多“微妙”信息,管理员将更改架构)。
为此,我为 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 之类的功能在客户端中不起作用,您需要使用元数据来放屁)。
设置模式语句的情况是否相同。或者这仅适用于我即将测试的准备好的语句。
如果是这样,那就引出了一个问题,为什么我只能从准备好的语句中更改模式?
想法和评论被极大地接受。
大卫
编辑:准备好的语句用于更改架构。所以现在只剩下第二个问题了。为什么准备好的陈述和普通陈述之间的区别......我认为谷歌的时间?
编辑:我不知道这是否会有所作为,但我在 Windows 平台上,使用标准 JDK (6),并且 eclipse indigo 在 eclipse 中运行 jUnit 测试。如果它可能有助于排除故障,我还可以使用 opendJDK 在 Linux(ubuntu) 上进行测试。