【问题标题】:Robotframework + JayDeBeApi + SQLServer gives SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true"Robotframework + JayDeBeApi + SQLServer 给出 SQLServerException:当 AutoCommit 模式设置为“true”时无法调用回滚操作
【发布时间】:2016-03-07 01:14:58
【问题描述】:

我使用robotframework DatabaseLibrary、JayDeBeApi、MS SQL Server JDBC驱动程序设置robotframework测试并成功连接。 但是我得到 SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true" when run any sql.

我尝试通过在 jdbc 连接 url 上添加“autoCommit=false”或在 sql 语句中添加“SET IMPLICIT_TRANSACTIONS ON”来关闭 AutoCommit,甚至在 SQL Server Management Studio 上检查 SET IMPLICIT_TRANSACTIONS ANSI 选项,但没有任何运气那些尝试。

这是robotframework maven插件设置

pom.xml

<plugin>
    <groupId>org.robotframework</groupId>
    <artifactId>robotframework-maven-plugin</artifactId>
    <version>1.4.5</version>
    <executions>
        <execution>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <extraPathDirectories>
            <extraPathDirectory>/opt/virtualenv_envs/robot/lib/python2.7/site-packages</extraPathDirectory>
            <extraPathDirectory>/usr/local/lib/python2.7/dist-packages</extraPathDirectory>
        </extraPathDirectories>
    </configuration>
    <dependencies>
        <dependency>  <!-- this jar from local nexus -->
            <groupId>com.microsoft.sqlserver.jdbc</groupId>
            <artifactId>sqljdbc41</artifactId>
            <version>4.1</version>
        </dependency>
    </dependencies>
</plugin>

下面是机器人测试

dbTest.robot

*** Settings ***
Library                         DatabaseLibrary
Library                         String
Library                         OperatingSystem
Suite Setup                     SuiteSetup
Suite Teardown                  SuiteTearDown 

*** Variables ***
${JDBC_DRIVER}                  'com.microsoft.sqlserver.jdbc.SQLServerDriver'
${JDBC_URL}                     'jdbc:sqlserver://{ipAddress}:1433;databaseName={myDB};user={username};password={password}'

*** Test Cases ***
Test Prepare Data
    [Documentation]             Reset Data
    Execute Sql String          UPDATE dbo.ImportHeader SET ExtractedOn=null;


*** Keywords ***
SuiteSetup
    Connect To Database Using Custom Params    jaydebeapi    ${JDBC_DRIVER},${JDBC_URL}

SuiteTearDown
    Disconnect From Database

这是我在运行机器人测试时遇到的错误

Test Prepare Data :: Reset Data...        | FAIL |
DatabaseError: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true".

我对此采取的一个激进的解决方案是修改robotframework DatabaseLibary connection_manager.py,在jaydebeapi 连接上将autoCommit 设置为false,如下所示self._dbconnection.jconn.setAutoCommit(False),但我希望知道如果有的话,比这更好的解决方案。

{你的 python virtualenv}/site-packages/DatabaseLibrary/connection_manager.py

import ConfigParser
from robot.api import logger

class ConnectionManager(object):
    """
    Connection Manager handles the connection & disconnection to the database.
    """




    def connect_to_database_using_custom_params(self, dbapiModuleName=None, db_connect_string=''):
        """
        Loads the DB API 2.0 module given `dbapiModuleName` then uses it to 
        connect to the database using the map string `db_custom_param_string`.

        Example usage:
        | # for psycopg2 |
        | Connect To Database Using Custom Params | psycopg2 | database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432 |

        | # for JayDeBeApi | 
        | Connect To Database Using Custom Params | JayDeBeApi | 'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t' |
        """
        db_api_2 = __import__(dbapiModuleName)

        db_connect_string = 'db_api_2.connect(%s)' % db_connect_string

        self._dbconnection = eval(db_connect_string)
        self._dbconnection.jconn.setAutoCommit(False)

【问题讨论】:

  • 在从 Robot Framework/DatabaseLibrary 运行 SQL 时,我遇到了与 RDB 数据库的 JDBC 驱动程序类似的问题。 DatabaseError:oracle.rdb.jdbc.common.RdbException:启用自动提交时操作无效。根据您的“激烈”解决方案,我使用 self._dbconnection.jconn.setAutoCommit(False) 修改 connection_manager.py 。可以将其制定为公认的答案(除非出现更好的答案)。

标签: sql-server jdbc robotframework jaydebeapi


【解决方案1】:

前段时间我也遇到过这个问题,但我记得它在 url 中使用自动提交(我的解决方案中的示例):

Connect To Database Using Custom Params    jaydebeapi     'net.sourceforge.jtds.jdbc.Driver', ['jdbc:jtds:sqlserver://${DB_HOST}:${DB_PORT}/${database};autocommit=false','${DB_USER}','${DB_PASSWORD}'],${jdbcDriver}

但不幸的是它不适用于 oracle,我不得不像你一样修改库。

【讨论】:

    【解决方案2】:

    您也可以在 DatabaseLibrary 实例中设置 autocommit false:

    Connect To Database Using Custom Params    jaydebeapi    'oracle.jdbc.driver.OracleDriver', 'jdbc:oracle:thin:@oracle.database.com:1234/foo', ['username_here', 'password_here'], '${CURDIR}/databasedrivers/ojdbc8.jar'
    ${DatabaseLibrary}    Get library instance    DatabaseLibrary
    Evaluate    $DatabaseLibrary._dbconnection.jconn.setAutoCommit(False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2020-06-02
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多