2013-07-05 37 views
2

我正面臨從Java執行sqlcmd的錯誤。我的代碼如下:從Java調用SQLCMD 7

Process process = Runtime.getRuntime() 
         .exec("sqlcmd -m-1 -S localhost,1433 -d my_server -U sa 
           -P abc -Q \"select * from Assests where AssetID > 
           'G123204E4-1234-4A31-B37B-0092D68DA429'\" -k2 -W 
           -h-1 -s\",\" -o \"D://Assests.csv\""); 

在運行從SqlClient中的sqlcmd其工作正常,但在Java它給下面的表達式錯誤:

Msg 4145, Level 15, State 1, Server SANDEEPB-PC, Line 1 An expression of non-boolean type specified in a context where a condition is expected, near 'AssetID'.

然而,當我改變「>」爲「=」 ,它工作正常。

有人可以告訴我爲什麼會發生這種情況,我能做些什麼呢?

+3

只是好奇,你爲什麼不使用JDBC? 另外,看起來像AssetID是一個varchar,'>'操作符沒有意義,因爲它不是確定性的。 「G123204E4-1234-4A31-B37B-0092D68DA429」是什麼? – dougEfresh

+0

嘗試使用「\>」轉義「>」。 –

+0

無法通過使用「\>」來轉義「>」 – sandybo

回答

1

您應該使用exec()的字符串數組版本傳遞命令,請參閱: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String[]) 這將正確地轉義所有參數。

Java Runtime exec() fails to escape characters properly

它應該是這樣的(未測試);

Process process = Runtime.getRuntime() 
    .exec(new String[] {"sqlcmd", "-m", "-1", "-S", "localhost,1433", "-d", "my_server", "-U", "sa", "-P", "abc", "-Q", "select * from Assests where AssetID > 'G123204E4-1234-4A31-B37B-0092D68DA429'", "-k2", "-W", "-h", "-1", "-s", ",\"", "-o", "D://Assests.csv"}); 

爲MySQL(測試)

Process process = Runtime.getRuntime() 
       .exec(new String[] {"mysql", "-u", "root", "-ppassword","-e", "select 1<2"}); 
+0

可否請您向我發送樣品。它不在這裏工作 – sandybo

+0

'.exec(「sqlcmd」,「 - m-1」,「-S」,「localhost,1433」,「 - d」,....)' 但是你已經在JAVA,只使用JDBC – dougEfresh