比如我已宣布,
双x;
现在我想分配
x = NULL我该怎么办?我已经看到了其他一些答案,但无法理解它们,这就是打开这个主题的原因.
由于这是一个关于try/finally子句行为的学术问题,我试图使用一个非常通用的例子.嵌套像这样的try/finally子句有什么危险吗?
openDatabaseConnection();
try {
// Methods unrelated to cursor
// ...
String cursor_id = openCursor();
try {
useCursor(cursor_id);
} finally {
closeCursor(cursor_id);
}
// Methods unrelated to cursor
// ...
} catch (Exception e) {
genericLogError();
} finally {
closeDatabaseConnection();
}
Run Code Online (Sandbox Code Playgroud)
具体来说,我很想知道closeCursor()以前是否保证会被调用closeDatabaseConnection().有没有理由嵌套一个finally子句,应该被认为是不好的做法?
通过将我的超类中的静态字段的属性设置为false,我在Grails中使用每个子类策略的表.这样,Grails为我的超类创建了一个表,为每个子类创建了一个附加表.tablePerHierarchymapping
但是,虽然超类和子类记录共享相同的ID(主键),但没有外键约束来保持它们的一致性,即可以删除超类记录,使子类记录处于无效状态.我想知道是否有设置/属性使GORM以某种方式解决这个问题,例如通过约束.或者是我手动添加外键的唯一选择?
例如,给定以下域类作为超类:
class Product {
String productCode
static mapping = {
tablePerHierarchy false
}
}
Run Code Online (Sandbox Code Playgroud)
以下域类作为子类:
class Book extends Product {
String isbn
}
Run Code Online (Sandbox Code Playgroud)
这导致创建两个表,即Product表和Book表.例如,当创建Book(通过脚手架页面)时,会在每个表中插入一条记录,它们唯一的链接就是每个表的ID值相同.具体来说,数据可能如下所示:
PRODUCT
Id Version ProductCode
1 1 BLAH-02X1
BOOK
Id ISBN
1 123-4-56-7891011-1
Run Code Online (Sandbox Code Playgroud)
由于在数据库级别没有为这些表定义正式关系,因此可以删除其中一个记录并保留另一个记录,从而导致数据无效.显然我可以使用SQL在两个ID字段上手动创建外键约束,但我希望让Grails处理它.这可能吗?
使用Grails 2.2.1
我正在使用System.Diagnostics类从我的C#应用程序执行批处理文件,在整个过程中使用输出更新我的GUI,但是只要我的批处理文件超过一定数量的行,该过程就会挂起.确切的线条数量似乎有所不同,但我已经能够使用一个简单的批处理文件重现它,打印出"Hello Kitty"316次:
@echo off
echo Hello Kitty
echo Hello Kitty
Run Code Online (Sandbox Code Playgroud)
等等
如果我删除第316行,批处理文件执行正常,表单应用程序按预期运行,但是更多行导致进程无限期挂起,甚至不生成前300个hello kitty中的一个.
这是我执行批处理文件的代码:
process = new System.Diagnostics.Process();
process.StartInfo.FileName = batchName;
process.StartInfo.Arguments = " < nul";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.Start();
Run Code Online (Sandbox Code Playgroud)
这些在其他地方宣布:
protected Process process;
protected StreamReader output;
Run Code Online (Sandbox Code Playgroud)
我的主要表单做了这样的事情(简化了一点):
string output;
while (!proc.Process.HasExited)
{
proc.Process.WaitForExit(200);
if (proc.Process.HasExited)
{
output = proc.Output.ReadToEnd();
rtbStatus.AppendText(output);
}
Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样做,我在网上找到的例子都没有提到批处理文件的大小限制.请指教.
我正在关注Grails In Action一书中的一个例子.我的集成测试失败,因为示例代码中的搜索返回空引用.我使用了对findAll()的调用,现在看来我的测试数据没有保存; all.size回归零.
void testBasicDynamicFinders() {
new User(userId: 'glen', password: 'secret', profile: new Profile(email: 'glen@glensmith.com')).save()
new User(userId: 'peter', password: 'sesame', profile: new Profile(homepage: 'http://www.peter.com/')).save()
def all = User.findAll()
assertEquals 2, all.size()
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用save(flush:true)无济于事.
我还在try ... catch结构中包含了一个save语句,但似乎没有引发任何异常.
Grails真的踢我的屁股.请帮我?
我正在尝试将Grails应用程序连接到Firebird数据库.
我在用:
到目前为止,这就是我所做的:
runtime "org.firebirdsql.jdbc:jaybird:2.2.2"到依赖项部分.dataSource部分:
dataSource {
pooled = false
driverClassName = "org.firebirdsql.jdbc.FBDriver"
dialect = "org.hibernate.dialect.FirebirdDialect"
username = "SYSDBA"
password = "masterkey"
}
Run Code Online (Sandbox Code Playgroud)
休眠部分:
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.provider_class = 'org.firebirdsql.pool.FBSimpleDataSource'
}
Run Code Online (Sandbox Code Playgroud)
(我也有cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory和cache.provider_class = 'com.opensymphony.oscache.hibernate.OSCacheProvider'在分开的场合上面的部分,但也作出的任何差异).
运行我的Grails应用程序时,启动失败并出现一个巨大的错误,归结为以下消息:
java.lang.IllegalStateException: Could not load JDBC driver class [org.firebirdsql.jdbc.FBDriver]
Run Code Online (Sandbox Code Playgroud)
我已经远程搜索了网络,但我无法在任何地方找到有效的Grails/Firebird配置示例.有一个修复浮动,涉及复制minij2ee.jar,但这是一个不同的错误消息.此外,人们建议清空.grails文件夹 - 我试过这个,但无济于事.
有人可以建议,我怎样才能让Grails与Firebird合作?
这是完整的例外,虽然在启动期间似乎重复了几次:
->> 303 | innerRun in …Run Code Online (Sandbox Code Playgroud) 我正在使用 Oracle 的 XMLType 函数从返回游标的存储过程获取 XML 数据。我的 SQL 看起来像这样:
select
XMLType(
package_name.storedProcName('PARAM1', 'PARAM2', 'PARAM3')
) as sresult
from dual;
Run Code Online (Sandbox Code Playgroud)
在存储过程返回记录的情况下,这工作正常并且我得到了我期望的 XML 结果。但是,当该过程没有返回任何记录时,我收到以下错误:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 334
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我最好返回 null、空白字符串或其他值。当然,我希望避免每次发生这种情况时都引发 Oracle 异常。我可以做什么来实现这个目标?
澄清:我的问题是,当存储过程返回空游标时,XMLType 构造函数会引发异常。如何检测 SQL 查询中的空游标?(不幸的是,我没有机会在 Oracle 端进行编程 - 我正在编写 Java 客户端。)
我正在调用一个返回引用游标的函数,我XMLType.createxml用来将结果转换为XML,例如
select XMLType.createxml(package_name.storedProcName('PARAM1', 'PARAM2', 'PARAM3')) as sresult from dual;
Run Code Online (Sandbox Code Playgroud)
但是,我发现这有一个不受欢迎的副作用.似乎用于检索XMLType数据的游标永远不会关闭.使用这种技术多次调用函数后,我总是遇到以下错误:
ORA-01000: maximum open cursors exceeded
Run Code Online (Sandbox Code Playgroud)
我没有光标的句柄,因此我无法手动关闭它.此外,我们使用池化连接,因此没有连接重置可以自动释放这些游标.关于这个还能做什么?
这是我的Oracle版本(从v $版本返回):
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for HPUX: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
Run Code Online (Sandbox Code Playgroud)
grails ×3
c# ×2
oracle ×2
xmltype ×2
batch-file ×1
cursor ×1
firebird ×1
foreign-keys ×1
grails-orm ×1
hibernate ×1
inheritance ×1
java ×1
jaybird ×1
jdbc ×1
nested ×1
sql ×1
try-finally ×1
xml ×1