【问题标题】:Javascript SQLite transaction loop not incrementing rowsAffectedJavascript SQLite 事务循环不增加 rowsAffected
【发布时间】:2014-09-26 23:35:57
【问题描述】:

我有一个自定义的 executeSql 语句,我在其中传递了一组查询和一组参数,以使其在单个事务中运行得更快。当它执行时,我可以看到每个 executeSql 的 rowsAffected 正在正确填充(我得到一些“0 条记录受影响”,还有一些“1 条记录受影响”)。

在我为自己确认输出后,我想跟踪总共更新了多少条记录。所以我只是添加一个计数器,然后在循环完成后输出该值。但最终结果显示我每次都有 0 条记录受到影响。

这里有什么问题?

    ExecuteQueryWhereQueryAndParamsBothArrays: function (queryArray, paramsArray, success, fail) {
        var hasError = false;
        var counter = 0;

        $rootScope.db.transaction(function (tx) {
            for (var i = 0; i < paramsArray.length; i++) {
                var query = queryArray[i];
                var params = paramsArray[i];

                tx.executeSql(query, params, function (tx, results) {
                    window.logger.logIt("results.rowsAffected: " + results.rowsAffected); // this is showing the correct results
                    counter += results.rowsAffected;
                }, function() {
                    hasError = true;
                    onError(tx, r);
                });
            }
        });

        if (hasError) {
            fail();
        } else {
            window.logger.logIt("successCounter: " + counter); // this always displays 0 (records)
            success(counter);
        }
    },

【问题讨论】:

    标签: javascript sql angularjs sqlite cordova


    【解决方案1】:

    您可以尝试将以下代码添加到db.transaction的成功处理程序中并检查计数器的值。

    var counter = 0;
    
    $rootScope.db.transaction(function (tx) {
    ...... // Your code.
    },errorDB,succesDB)
    
    function successDB(){
      window.logger.logIt("successCounter: " + counter);
      console.log("successCounter: " + counter); // Your counter variable should contain the total
    }
    
    function errorDB(err){
     console.log("Error processing SQL:Message:" + err.message + "CODE:" + err.code);
    }
    

    【讨论】:

      【解决方案2】:

      我最终实现了 @frank 建议的事务回调,但我的计数器仍然为 0。虽然 results.rowsAffected 总是准确的,但由于某种原因,计数器变量永远无法在 for 循环之外访问。我最终实现了全局变量($rootScope.{variablename} 为你有角度的人),并且每次都从 results.rowsAffected 中增加它并且有效。

      var inc = function(incCounter) {
         $rootScope.counter = $rootScope.counter + incCounter;
      };
      
          ExecuteQueryWhereQueryAndParamsBothArrays: function (queryArray, paramsArray, success, fail) {
              var hasError = false;
              var counter = 0;
      
              $rootScope.db.transaction(function (tx) {
                  for (var i = 0; i < paramsArray.length; i++) {
                      var query = queryArray[i];
                      var params = paramsArray[i];
      
                      tx.executeSql(query, params, function (tx, results) {
                          window.logger.logIt("results.rowsAffected: " + results.rowsAffected); // this is showing the correct results
                          inc(results.rowsAffected);
                      }, function(tx, r) {
                          hasError = true;
                          onError(tx, r);
                      });
                  }
              }, function () {
         fail();
      }, function () {
         success();
      });
          },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-01
        • 2013-01-16
        • 2015-01-04
        • 2012-02-28
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        相关资源
        最近更新 更多