使用Groovy脚本执行SQL查询

时间:2017-12-08 15:01:00

标签: sql groovy soapui

我正在尝试使用Groovy脚本运行SQL更新查询。

//Global Properties Value
def dbServer = context.expand('${#Project#DB_Server}')
def dbPort = context.expand('${#Project#DB_Port}')
def dbName = context.expand('${#Project#DB_Name}')
def dbUser = context.expand('${#Project#DB_Username}')
def dbPass = context.expand('${#Project#DB_Password}')
def userID = context.expand('${#Project#userID}').toInteger()

//Convert HEX to Integer
def userSerialHex = context.expand('${#Project#userSerial}').toString();
BigInteger userSerialInteger = Long.parseLong(userSerialHex, 16);

log.info userSerialHex
log.info userID
log.info userSerialInteger

//Connection String
def con = Sql.newInstance("jdbc:sqlserver://$dbServer:$dbPort;" + "databaseName=" + dbName, dbUser, dbPass, 'com.microsoft.sqlserver.jdbc.SQLServerDriver')

//SQL Query
con.execute("update tblUserCardDetail set active=0 where fkUserID = $userID and cardValue = $userSerialInteger");

结果:

Fri Dec 08 20:24:25 IST 2017:INFO:182A11A53C68BD3C
Fri Dec 08 20:24:25 IST 2017:INFO:12901
Fri Dec 08 20:24:25 IST 2017:INFO:1741223607312891196

预期:它应返回true并更新行。

我得到的错误:

  

com.microsoft.sqlserver.jdbc.SQLServerException:不支持从UNKNOWN到UNKNOWN的转换。行错误:27

当我从sql server运行查询时,它已成功更新。

update tblUserCardDetail set active=0 where fkUserID=12901 and cardValue=1741223607312891196

4 个答案:

答案 0 :(得分:1)

我认为你需要明确地将BigInteger userSerialInteger转换为String。

类似的东西:

con.execute("update tblUserCardDetail set active=0 where fkUserID = $userID and cardValue = ${userSerialInteger.toString()}");

来自groovy.sql.Sql#execute(groovy.lang.GString)

的源代码
    List<Object> params = getParameters(gstring);
    String sql = asSql(gstring, params);
    return execute(sql, params);

传递gstring的参数而不进行处理。

答案 1 :(得分:1)

在SoapUI中使用Groovy Script使用sql连接时需要注意的事项。

  1. 复制SOAPUI_HOME/bin/ext目录下的驱动程序库并重新启动该工具。
  2. 首先使用驱动程序类名称注册驱动程序。例如,mysql服务器

    com.eviware.soapui.support.GroovyUtils.registerJdbcDriver(&#34; com.mysql.jdbc.Driver&#34;)

  3. 现在使用您的连接并执行查询。

  4. 回到你的问题,你可以使用jTDC驱动程序并将jar文件复制到上述位置。

    获取连接的脚本:

    def DRIVER_CLASS='net.sourceforge.jtds.jdbc.Driver'
    def CONNECTION_STRING="jdbc:jtds:sqlserver://${databaseServer}:${databasePort}/${databaseName};domain=${domain}" as String
    com.eviware.soapui.support.GroovyUtils.registerJdbcDriver(DRIVER_CLASS)
    def sql = Sql.newInstance(CONNECTION_STRING, DRIVER_CLASS)
    

    现在您应该能够使用sql.execute(..)执行查询。

    请注意,上面的连接字符串使用占位符值,只需使用正确的变量或使用实际值。

答案 2 :(得分:0)

这种类型的错误来自SQL驱动程序试图告诉您它不知道如何转换您作为参数传递的值。

您可以尝试将int userID更改为groovy.sql或将参数转换为如下所示。

即使con.executeUpdate('update tblUserCardDetail set active=0 where fkUserID = ? and cardValue = ?', [userID.toInteger(), userSerialInteger]) 足够聪明,也可以更改它,我也建议您使用带有参数的方法来更新语句(例如fiddle):

execute(GString)

编辑:正如@a​​ristotll所说,.triangle-bottomright { transition: all .3s ease-in-out; width: 0; height: 0; right: 0; top: 0; border-bottom: 300px solid $blue; border-left: 298px solid transparent; z-index: 1; position:absolute; } 并不那么聪明。这加强了我的建议,因为转换为文本不是一个很好的做法。但是,如果您使用的是Microsoft JDBC驱动程序,还需要确保双方都使用正确的类型,如文档groovy.sql.Sql.executeUpdate(String, List)所示。

答案 3 :(得分:0)

不知何故,当我以其他方式更改SQL连接时,它可以工作,这次我参数包括jdbc驱动程序的整个连接:

import groovy.sql.Sql
def dbString = context.expand('${#Project#DB_String}')
def dbDriver = context.expand('${#Project#DB_Driver}')
def dbUser = context.expand('${#Project#DB_Username}')
def dbPass = context.expand('${#Project#DB_Password}')
def con = Sql.newInstance(dbString, dbUser, dbPass, dbDriver)

//SQL Query
con.execute("update tblUserCardDetail set active=0 where fkUserID = $userID and cardValue = '$userSerialInteger'");