2013-05-20 42 views
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連接時,它對'Action'表格很有用。

我希望有人能解釋錯誤並提供修復。

對於那些讀書,我發現這個選項作爲解決方法

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

雖然有可能是一個更簡潔的選擇,用 「+」;對我來說,感覺就像使用$ {tabl}應該工作一樣。

由於提前,

+0

您是否嘗試過使用' 'SHOW FULL COLUMNS FROM $ {} TABL;''(注意單引號代替雙引號)? – dmahapatro

+0

[在SQL查詢中動態設置數據庫]的可能重複(http://stackoverflow.com/questions/2267756/dynamically-set-the-db-in-a-sql-query) –

回答

3

我認爲問題是,當你使用的字符串變量產生比當你不使用它不同的對象類型。一個是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功能是這種差異出於某種原因很敏感。您正在使用的兩個功能是

但是我不明白爲什麼他們會表現不同..

另一種解決方法是調用toStringquery變量 - 這會將其重新轉換爲String

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

>> 

class java.lang.String 
3

我也遇到過這個問題。您的解決方法可行,但更簡單的方法是在org.codehaus.groovy.runtime.GStringImpl版本上撥打toString()。也就是說,如果您不需要任何預備的語句功能或執行保護。這是由於Groovy SQL引擎試圖將其變爲準備好的語句,因爲它將原始字符串視爲GString。爲了防止SQL注入攻擊,當使用可以從最終用戶提供的值時,您會想要這樣做。在你的情況和我的這不是一個問題,所以toString()工作得很好。

參見: http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

+0

這是我不得不做。我的eachRow方法使用GString來嘗試將我的查詢轉換爲準備好的語句。由於它是隻讀的,並且輸入不是來自用戶,我所要做的只是: sql.eachRow(query.toString()){// stuff} – Shastings