【问题标题】:Querying SQL Server with Google Apps Script via JDBC通过 JDBC 使用 Google Apps 脚本查询 SQL Server
【发布时间】:2013-03-15 19:47:22
【问题描述】:

我正在使用 SQL Server 2008 R2 并尝试使用 Google Apps 脚本对其进行查询。我正在使用应该填充电子表格的建议脚本之一,但我在连接 SQL 时遇到问题。

我已经检查了我指定的端口是正确的,所以我怀疑问题出在哪里,我非常感谢确认我的连接字符串是正确的。

这是代码 -

服务器/实例:1433;数据库名称=xxxx;用户=xxxx;密码=xxxx");

function foo() {
  var conn = Jdbc.getConnection   ("jdbc:sqlserver/instance:1433;databaseName=xxxx;user=xxxx;password=xxxx");
  var stmt = conn.createStatement();
  stmt.setMaxRows(100);
  var start = new Date();
  var rs = stmt.executeQuery("select top 1000 from SOP10100");

  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var cell = doc.getRange('a1');
  var row = 0;
  while(rs.next()) {
    cell.offset(row, 0).setValue(rs.getString(1));
    cell.offset(row, 1).setValue(rs.getString(2));
    cell.offset(row, 2).setValue(rs.getString(3));
    cell.offset(row, 3).setValue(rs.getString(4));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));

感谢您的帮助!

【问题讨论】:

  • 你看到了什么错误信息?
  • “无法建立数据库连接。检查连接字符串、用户名和密码”,这就是为什么我想知道代码的原因,因为用户名和密码详细信息是正确的。

标签: sql-server-2008-r2 google-apps-script


【解决方案1】:

我认为您的连接字符串格式有些错误。我相信您的服务器名称/实例之前需要一个sqlserver://

我手边没有 SQL Server 实例,但我针对 SQL Azure 测试了以下代码,它运行良好。我能够从名为 helloworld 的表中选择数据并将其写入电子表格。

我已将我的凭据替换为占位符。

function readAzure() {
  var conn = Jdbc.getConnection("jdbc:sqlserver://XYZ.database.windows.net:1433;databaseName=MYDATABSENAME","USERNAME","PASSWORD");
  var stmt = conn.createStatement();
  var rs = stmt.executeQuery("select * from helloworld");

  var doc = SpreadsheetApp.create('azure');
  var cell = doc.getRange('a1');
  var row = 0;
  while(rs.next()) {
    cell.offset(row, 0).setValue(rs.getString(1));
    cell.offset(row, 1).setValue(rs.getString(2));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
}

【讨论】:

    【解决方案2】:

    我在 GitHub 上有一个完整的项目,它是一个 Mysql 和 SQL Server JDBC 连接应用程序。你可以在这里找到它:GitHub Project。我已经在下面发布了相关代码。 SQL Server 案例是您为连接实例化参数的地方,然后下面是连接的其余部分。要获得完整的工具,请使用 GitHub 项目。

      function readFromTable(queryType, queryDb, query, tab, startCell) {
      // Replace the variables in this block with real values.
      var address;
      var user;
      var userPwd ;
      var dbUrl;
    
      switch(queryType) {
        case 'sqlserver':
          address = '%YOUR SQL HOSTNAME%';
          user = '%YOUR USE%';
          userPwd = '%YOUR PW%';
          dbUrl = 'jdbc:sqlserver://' + address + ':1433;databaseName=' + queryDb;
          break;
        case 'mysql':  
          address = '%YOUR MYSQL HOSTNAME%';
          user = '%YOUR USER';
          userPwd = '%YOUR PW%';
          dbUrl = 'jdbc:mysql://'+address + '/' + queryDb;
        break;
      }
    
      var conn = Jdbc.getConnection(dbUrl, user, userPwd);
      var start = new Date();
      var stmt = conn.createStatement();
      var results = stmt.executeQuery(query);
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var sheetTab = sheet.getSheetByName(tab);
      var cell = sheetTab.getRange(startCell);
      var numCols = results.getMetaData().getColumnCount();
      var numRows = sheetTab.getLastRow();
      var headers ;
      var row =0;
    
      clearRange(tab,startCell,numRows, numCols);
    
    
      for(var i = 1; i <= numCols; i++){
        headers = results.getMetaData().getColumnName(i);
          cell.offset(row, i-1).setValue(headers);
          }
    
      while (results.next()) {
        var rowString = '';
        for (var col = 0; col < numCols; col++) {
          rowString += results.getString(col + 1) + '\t';
          cell.offset(row +1, col).setValue(results.getString(col +1 ));
        }
        row++
        Logger.log(rowString)
      }
    
      results.close();
      stmt.close();
    
      var end = new Date();
      Logger.log('Time elapsed: %sms', end - start);
    }
    

    【讨论】:

      【解决方案3】:

      我已经破解了 :).... 至少对于我们的 SQL Server 和 google 电子表格!

      感谢所有帮助。我一直在这里阅读一些问题,现在我想分享您帮助我构建的内容。我已经构建了一个函数,它可以接受 SQL 查询并将结果输出到其所在的电子表格中。

      要获取电子表格上的数据,您需要打开一个谷歌电子表格并转到“工具”>“ 脚本编辑器”。然后通过下面的代码说明并包含“/ **** .....”。接下来,您将不得不更新代码中的这些位

      var address = 'yourServerUrl:yourPortNumber';
      var user = 'yourUserName';
      var userPwd = 'yourPassword';
      var db = 'yourDatabaseName';
      

      然后需要保存并返回电子表格输入

      =SQLTOGOOGLOOGLESPREADSHEET("yourSqlQuery")
      

      进入电子表格单元格

      /***********************
      
      @CUSTOMFUNCTION
      
      */
      
      function SQLTOGOOGLOOGLESPREADSHEET(sqlQuery) {
          var address = 'yourServerUrl:yourPortNumber';
          var user = 'yourUserName';
          var userPwd = 'yourPassword';
          var db = 'yourDatabaseName';
          var msSqlUrlSyntax ='jdbc:sqlserver://'
      
          var dbUrl = msSqlUrlSyntax + address + ';databaseName=' + db;
      
          // msSqlUrlSyntax = 'youOptionalTestingQuery'
          var conn = Jdbc.getConnection(dbUrl, user, userPwd);
      
          var start = new Date();
          var stmt = conn.createStatement();
          stmt.setMaxRows(1000);
      
          var results = stmt.executeQuery(sqlQuery);
          var numCols = results.getMetaData().getColumnCount();
          var numRows = results.getFetchSize()
          Logger.log(numRows)
          var dataArray = [];
      
          while (results.next()) {
              var rowString = [];   
              rowString = [];
      
              for (var col = 0; col < numCols; col++)     
              {
                  rowString.push(results.getString(col + 1))
              }
      
              dataArray[dataArray.length]=rowString;
          }
      
          Logger.log("dataArray =" + dataArray)
          return dataArray
      
          results.close();
          stmt.close();
      
          var end = new Date();
          Logger.log('Time elapsed: %sms', end - start);
      }
      

      【讨论】:

      • 好主意(让它成为一个函数)。请注意,您在清理资源之前返回。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多