5

我有一个关于在 JDBC SQL 查询中使用字符串的问题。这里有两个例子,我希望它们都能工作,但它们没有。

工作版...

    tabl  = "Action"
    query = "SHOW FULL COLUMNS FROM `Action`;"  
    println "   "+ query
    dbConnection.eachRow( query ){

在错误变体中:

    tabl  = "Action"
    query = "SHOW FULL COLUMNS FROM `${tabl}`;"
    println "   "+ query
    dbConnection.eachRow( query ){

该错误作为 SQL 语法错误返回。如您所见,这些语句在文本上是相同的。

输出显示语句,然后是错误:

   SHOW FULL COLUMNS FROM `Action`;
   May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow
   WARNING: Failed to execute: SHOW FULL COLUMNS FROM `?`; because: 
      Parameter index out of range (1 > number of parameters, which is 0).
   May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow

我认为这只是 Groovy 试图寻找罪魁祸首。当我将文字字符串提供给 JDBC 连接时,它适用于“操作”表。

我希望有人可以解释错误并提供修复。

对于那些阅读,我发现这个选项是一种解决方法

query = "SHOW FULL COLUMNS FROM `"+ tabl.toString() +"`;" 

虽然可能有一个不太冗长的选项,但使用“+”;对我来说,感觉好像使用 ${tabl} 应该有效。

提前致谢,

4

2 回答 2

4

我也遇到了这个。您的解决方法有效,但更简洁的方法是调用toString()org.codehaus.groovy.runtime.GStringImpl版本。也就是说,如果您不需要任何准备好的语句功能或执行保护。这是由于 Groovy SQL 引擎试图将其转换为准备好的语句,因为它将原始字符串视为GString. 为了防止 SQL 注入攻击,在使用最终用户可能提供的值时,您会希望这样做。在你和我的情况下,这不是一个问题,所以toString()工作得很好。

参见: http: //groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

于 2013-09-26T16:56:31.067 回答
3

我认为问题在于,当您使用 in-string 变量时,会产生与不使用它时不同的对象类型。一个是一个String,另一个是一个GString

例如,查看此脚本和输出:

def a = "123"
def b = "abc"+a
def c = "abc${a}"
println b.class
println c.class

>>

class java.lang.String
class org.codehaus.groovy.runtime.GStringImpl

eachRow由于某种原因,该功能似乎对这种差异很敏感。您正在使用的两个功能是

但我不明白为什么他们的行为会有所不同..

toString另一种解决方法是调用query变量 - 这会将其转换回String

def d = c.toString()
println d.class

>>

class java.lang.String
于 2013-07-24T00:14:34.817 回答