谷歌脚本:JDBC prepareStatement 失败

Posted

技术标签:

【中文标题】谷歌脚本:JDBC prepareStatement 失败【英文标题】:Google Script: JDBC prepareStatement Failing 【发布时间】:2021-09-09 10:22:53 【问题描述】:

尽管在这里阅读了其他帖子,通过谷歌,我仍然无法确定我的 prepareStatement 有什么问题:

function sqlInsertEntities()
  const conn = sqlGetConnection();
  if (!conn)  return;   // Check conn is successful first!
  ...
  var sqlData = filteredData.map(arrangeCols); // map to same column order as in mysql
  Logger.log(sqlData); 
    /** As expected, returns:
     * [ [1.0, SSLPA, Sietel Ltd, 7.0, ASX:SSLPA], [1.0, WHFPA, Whitefield Ltd, 7.0, ASX:WHFPA], 
     * [4.0, XTL, S&P/ASX 20, 7.0, INDEXASX:XTL], [4.0, XFL, S&P/ASX 50, 7.0, INDEXASX:XFL] ]
     */
  try 
    conn.setAutoCommit(false);
    var stmt = conn.prepareStatement(
      'INSERT INTO ' + 
      'entity (entity_type_id, entity_code, entity_name, exchange_id, googlefinance_ticker) ' + 
      'values (?, ?, ?, ?, ?),' +
      ' true');                     // Statement.RETURN_GENERATED_KEYS ???
    for (var i=0; i<sqlData; i++) 
      stmt.setInt(   1, sqlData[i][0]);
      stmt.setString(2, sqlData[i][1]);
      stmt.setString(3, sqlData[i][2]);
      stmt.setInt(   4, sqlData[i][3]);
      stmt.setString(5, sqlData[i][4]);
      stmt.addBatch();
    
    var batch = stmt.executeBatch();
    conn.commit();
    Logger.log(batch.length); 
    // Returns 0.  The INSERT is not happening, but no Error returned?
   
  catch (e) 
    Logger.log('Error: ' + e + ' : ' + e.getMessage() + '\nline: ' + e.lineNumber);
    Browser.msgBox('Error',e + ' : ' + e.getMessage() + '\\nline: ' + e.lineNumber, Browser.Buttons.OK);
  
  finally 
    stmt.close();
    conn.close();
  


我还尝试从 prepareStatement 中删除 true 参数,因为我不确定如何恢复 autoGeneratedKeys,但这并没有什么区别。

这是我第一次尝试将 MySQL 与 Google 表格一起使用,因此我们将不胜感激任何建议或更正。

【问题讨论】:

您是否收到任何错误信息? 不,根本没有! 【参考方案1】:

并不是一个真正的答案,但作为一种变通方法,我已经准备好完整的 SQL 语句,然后使用 createStatement:

  // Prepare SQL
    var sql = 'INSERT INTO ' + 
      'entity (entity_type_id, entity_code, entity_name, exchange_id, googlefinance_ticker) ' + 
      'values ';
    var rows = sqlData.length;
    var cols = sqlData[0].length;
    for (var row=0; row<rows; row++) 
      sql = sql + '('
      for (col=0; col<cols; col++) 
        if ( isNaN( sqlData[row][col] ) && sqlData[row][col].length > 0 ) 
          // Need to encapsulate strings
          sql = sql + "'" + sqlData[row][col].toString() + "'";
         else 
          sql = sql + sqlData[row][col];
        
        if ( col != cols-1 )  sql = sql + ','; 
      
      sql = sql + '),';
    
    sql = sql.substr(0,sql.length-1);
    // Logger.log(sql);
  //

  // Execute SQL
    try 
      var stmt = conn.createStatement();
      var response = stmt.executeUpdate(sql);  // Nb: executeQuery is only for SELECT statements
      Logger.log(response);
     
    catch (e) 
      Logger.log('Error: ' + e + '\nline: ' + e.lineNumber);
      Browser.msgBox('Error',e + '\\nline: ' + e.lineNumber, Browser.Buttons.OK);
    
    finally 
      stmt.close();
      conn.close();
    
  //

还没有弄清楚为什么 prepareStatement 在 Google 脚本中不起作用,但至少它起作用了。

【讨论】:

以上是关于谷歌脚本:JDBC prepareStatement 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何优化我的 Google 脚本以更快地检索 SQL 数据?

Mybatis-入门演示

Mybatis-入门演示

Google脚本和Oracle数据库连接失败

无法从 .sql 文件创建存储过程 - JDBC

BigQuery 是不是有谷歌支持的 JDBC 驱动程序?