我的应用程序中有一个嵌入式derbyDB,我正在测试我的代码。
如果我发送以下SQL代码
set current schema [newSchemaName];
从ij 然后我可以设置架构和来自
的DB的响应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和客户端之间存在一些差异(如描述的功能在客户端不起作用,你需要放弃元数据)。
设置架构声明的情况是否相同。或者这只是来自准备好的声明,我将要测试。
如果是这样,那就引出了为什么我只能从准备好的语句中更改模式的问题?
认真接受的想法和评论。
大卫
编辑: 准备好的语句适用于更改架构。所以现在只是第二个问题。为什么准备好的陈述和正常陈述之间的区别...谷歌的时间我认为?
编辑: 我不知道它是否有所作为,但我在Windows平台上,使用标准JDK(6),并在eclipse中运行jUnit测试的eclipse indigo。我还可以使用opendJDK在Linux(ubuntu)上测试它是否有助于排除故障。
答案 0 :(得分:0)
我不确定你的问题是什么。
您可以在表引用中明确指定架构,如:
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语句中的所有表引用中明确指定模式,然后我会确定我在使用哪个模式。< / p>