Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何判断从JDBC执行中更改的行数_Java_Jdbc - Fatal编程技术网

Java 如何判断从JDBC执行中更改的行数

Java 如何判断从JDBC执行中更改的行数,java,jdbc,Java,Jdbc,我不确定如何获得受SQL执行影响的行数 我喜欢这样: boolean isResultSet=statement.execute(arbitrarySQLCommand); 我可以通过getUpdateCount()方法获得受影响的行数。那很好。我的问题是当更新计数为零时。这可能意味着: 这是一个DML语句,但它不影响任何行。受影响的零行是有效响应。我只是说有些条件没有满足 这是一个非DML语句(很可能是DDL语句)。。根据定义,它不会更改行,因此更新计数始终为零(duh!)。或者换一种说法:

我不确定如何获得受SQL执行影响的行数

我喜欢这样:

boolean isResultSet=statement.execute(arbitrarySQLCommand);
我可以通过
getUpdateCount()
方法获得受影响的行数。那很好。我的问题是当更新计数为零时。这可能意味着:

  • 这是一个DML语句,但它不影响任何行。受影响的零行是有效响应。我只是说有些条件没有满足

  • 这是一个非DML语句(很可能是DDL语句)。。根据定义,它不会更改行,因此更新计数始终为零(duh!)。或者换一种说法:更新计数的概念对于此类语句来说毫无意义

  • 我希望能够区分上述情况1和2。怎么做

    我对生成输出的语句不感兴趣,所以我也可以使用,但在我看来,该方法的返回值具有相同的缺陷:

    返回:

    (1)SQL数据操作语言(DML)语句的行数,或(2)不返回任何内容的SQL语句的行数为0


    我希望是:

    返回:

    (1)SQL数据操作语言(DML)语句的行数,或(2)-1(不返回任何内容的SQL语句)



    (注意:我事先不知道
    arbitrarySQLCommand
    的内容)



    最终选择的解决方案 对于这个问题,似乎没有一个真正的类似JDBC的解决方案。在我看来,JDBC的设计者在
    getUpdateCount
    上犯了一个严重的错误,使用值0(零)表示一个(根据定义)不影响行的语句,因为受影响的零行也是DML语句结果的一个完全有效的值

    唯一可能的解决方案似乎是对SQL语句进行某种模式匹配,以确定它是DML语句(INSERT、UPDATE、DELETE)还是其他类型的SQL语句。大概是这样的:

  • 任意SQLCommand
    中提取第一个单词。一个字被终止 通过空格或EOL行字符
  • 如果这个词(忽略) 如果是INSERT、UPDATE或DELETE,则为DML语句 并且
    getUpdateCount()
    的输出是相关的,否则
    getUpdateCount()
    的输出与此无关

  • 丑陋且容易出错。但这个问题唯一可能的解决办法是:-(

    您所能做的最好的事情就是检查SQL语句

    Set<String> dmlCommands = new HashSet<String>() {
      {
        add("UPDATE"); add("INSERT"); add("DELETE"); //Add more DML commands ....
      }
    };
    int updateCount = statement.getUpdateCount();
    for(String dml : dmlCommands) {
        if(arbitrarySQLCommand.toUpperCase().contains(dml) && updateCount == 0) {
            updateCount = -1;
            break;
        }
    }
    
    Set-dmlCommands=new-HashSet(){
    {
    添加(“更新”);添加(“插入”);添加(“删除”);//添加更多DML命令。。。。
    }
    };
    int updateCount=statement.getUpdateCount();
    for(字符串dml:dmlCommands){
    if(arbitrarySQLCommand.toUpperCase().contains(dml)&&updateCount==0){
    updateCount=-1;
    打破
    }
    }
    
    也许我的答案对你的提问没有帮助,但我是在运行DML后搜索如何获得受影响的行数,而不是发现的行数-使用MySQL。我在这里写下了我的发现,以帮助其他人

    我的问题是,例如,当我运行一条语句时,它不会对表进行任何更改

    UPDATE table SET field=1 WHERE field=1
    
    方法
    语句。executeUpdate(…)
    返回找到的行数,而不是更改/受影响的行数。因此我无法判断查询是否修改了表中的某些内容

    要更改这一点,在创建连接时(使用
    DriverManager.getConnection()
    ),应在url中提供一个选项,如下所示:

    jdbc:mysql://${jdbc.host}/${jdbc.db}?
    useffectedrows=true

    我在这里找到的:

    和MySQL文档:


    你读过吗?@新白痴:谢谢,但在我看来,这个博客只是指出了JDBC中与我遇到的相同的设计问题。通常你会知道你的SQL语句是否是update语句,所以你会知道是否调用executeQuery(),executeUpdate()@EJP:如果我正在创建一个GUI应用程序,用户可以在其中输入任意SQL语句,那么我事先不知道SQL语句。如果我使用
    executeQuery()
    executeUpdate()
    ,等等,其实并不重要,因为它们都会遇到所描述的问题。@EJP:让我们回顾一下:作为一个例子(您所说的符合要求)让我们看看从
    executeUpdate()
    返回的值:(1)SQL数据操作语言(DML)语句的行数,(2)对于不返回任何内容的SQL语句的行数为0。问题是0(零)也是DML语句的可能返回值,因此我无法从返回值区分DML语句和非DML语句。这不是一个完整的证明解决方案。我可以将列名作为insert或UPDATE。您可能希望执行
    startsWith()
    而不是
    contains())
    让它更安全一点。但是,我觉得它仍然不是解决问题的正确方法。我将不情愿地接受这个答案。我之所以不情愿,是因为我确实不喜欢这个解决方案,但它似乎是唯一的解决方案,对此,你当然应该受到表扬。:-)