尝试使用jdbc读入数据库时​​出现Google Apps脚本错误

时间:2013-09-07 01:21:29

标签: mysql sql jdbc google-apps-script

我有一个谷歌应用程序脚本,它在一个实例中工作,但不是另一个

两个脚本都是相同的,我编程的唯一区别是jdbc查询。

这是工作职能:

function wbk() {
  var conn = Jdbc.getConnection("jdbc:mysql://aaa.aaaa.org:3306/aaaaa", "aaaa", "bbbbb");
  var stmt = conn.createStatement();
  stmt.setMaxRows(10000);
  var start = new Date();
  var rs = stmt.executeQuery("SELECT `DateUpdate`, `AllianceName`, `PlayerName`, `Score`, `Rank`, `TotalCities`, `FameTotal`, `FameRank`, `DefeatedTotal`, `DefeatedRank`, `PlunderTotal`, `PlunderRank` FROM `Member` WHERE AllianceID='2' OR AllianceID='48'");
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var first = doc.getSheetByName("WBK");
  first.activate();
  var cell = first.getRange('b2');
  var row = 0;
  while (rs.next()) {
    for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
      cell.offset(row, col).setValue(rs.getString(col + 1));
    }
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));
};

我在更新数据库之后运行了两次,结果很完美,正是预期的结果。

现在,当我尝试使用相同的函数,并且只修改查询时(我检查了数据库中的SQL语句,这很好),该函数失败。

这是非工作功能。

function WC_Combined() {
  var conn = Jdbc.getConnection("jdbc:mysql://aaa.aaaa.org:3306/aaaaa", "aaaa", "bbbbb");
  var stmt = conn.createStatement();
  stmt.setMaxRows(10000);
  var start = new Date();
  var rs = stmt.executeQuery("SELECT `DateUpdate`, `AllianceName`, `PlayerName`, `Score`, `Rank`, `TotalCities`, `FameTotal`, `FameRank`, `DefeatedTotal`, `DefeatedRank`, `PlunderTotal`, `PlunderRank` FROM `Member` where AllianceID='195' OR AllianceID='494'");
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var first = doc.getSheetByName("Combined");
  first.activate();
  var cell = first.getRange('b2');
  var row = 0;
  while (rs.next()) {
    for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
      cell.offset(row, col).setValue(rs.getString(col + 1));
    }
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));
};

我在Google上的调试控制台中收到的错误消息是

Service error: Spreadsheets (line 110, file "Code")

我的代码中的第110行是我在上面提供的第二个函数中的cell.offset(row, col).setValue(rs.getString(col + 1));;我在第二个函数或我提供的第一个例子中找不到这一行的任何区别----并且我们第一次尝试运行它们时都工作了。

任何想法,任何人?我甚至没有使用自定义代码,代码基本上是谷歌应用程序文档示例。

我在Google Docs Spreadsheet中使用Google脚本,连接到mysql。我打开了与mysql的远程连接,并有2个工作电子表格,所以我知道连接有效。

2 个答案:

答案 0 :(得分:0)

自2011年7月以来,问题跟踪器中的

Issue 703继续看到用户报告此事件的实例。访问并为问题加注明星更新,并添加任何可能有助于googlers隔离问题的信息。

答案 1 :(得分:0)

您的循环是否可能对Spreadsheet API造成太大压力?

我将更多地包含从我的sql行填充数据结构,然后将生成的二维数据数组应用到正确的范围。

var data = [];
while (rs.next()) {
    var rowData = [];
    for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
        rowData[col] = (rs.getString(col + 1));
    }
    data[row] = rowData;
    row++;
}

var range = first.getDataRange(1,2,row, col+1); // check edges or uses a1 notation

range.setValues(data);

这样做的好处是效率更高,并且不会通过快速的双循环来强调API。

如果您需要更多信息,请告诉我它是怎么回事。