我正在尝试使用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
答案 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连接时需要注意的事项。
SOAPUI_HOME/bin/ext
目录下的驱动程序库并重新启动该工具。首先使用驱动程序类名称注册驱动程序。例如,mysql
服务器
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver(&#34; com.mysql.jdbc.Driver&#34;)
现在使用您的连接并执行查询。
回到你的问题,你可以使用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)
编辑:正如@aristotll所说,.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'");