谷歌脚本: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 失败的主要内容,如果未能解决你的问题,请参考以下文章