Azure Functions から SQLServerに接続する(node.js編)


# 前提
・空のAzureFunctionsの関数ができている。
・どこかに、SQLServerがたっている。

SQL接続には、tediousドライバーを使用します。
https://www.npmjs.com/package/tedious

急ぎ、他人に伝える必要があったので、手順をメモ程度に。

以下では、tediousのazurefunctionsへのインストール手順とサンプルコードで接続確認を行います。

# 手順
1. azureポータルの「プラットフォーム機能」メニューより、「コンソール」を起動する。


```
>cd HttpTriggerJS1
HttpTriggerJS1>npm init -y
HttpTriggerJS1>npm install tedious --save

```

2. 適当なコードを追加する。

この例では、index.jsの先頭に、以下でも追加して見る。
phonebookというテーブルが、xxxx.database.windows.netの、ddddというデータベースにある前提。
データベースユーザーは、ID/Passwordが、uuuu/ppppとする。

```javascript
var Connection = require('tedious').Connection;
var TedRequest = require('tedious').Request;
var TYPES = require('tedious').TYPES;  

function scan_table(context, q_name){
  
   //データベース接続情報
    var config = {  
        userName: 'uuuu',  
        password: 'pppp',  
        server: 'xxxx.database.windows.net',   
        options: {
          encrypt:  true, 
          database: 'dddd'
        }  
    };
    
    //SQLは、一応、prepared statementにする。
    var query = "SELECT [familyname], [mobilenumber] "+
        "FROM [dbo].[phonebook] "+
        "WHERE [familyname] = @WHO";
            
    //CreateConnection
    var connection = new Connection(config);

    //接続
    connection.on('connect', function(err) {  
        if(err){
            //Error Handling
        } else {  
            // SQL実行
            results = executeStatement(query, obj);
        }
    });
    
    connection.on('end', function(err){
        console.log("connection End");
    });
  
  	//SQL実行の実体
    function executeStatement(query) { 

		//応答を詰め込むバッファ
        var arr = [];
        var con_cnt = 2; //取得する列数
        
        console.log("executeStatement start"); 
        queryrequest = new TedRequest(query, function(err){
            if (err) {
                console.log(err);
            } else {
				//応答を返す場所。
				//arrをいい感じに処理する。
                context.log(arr[0][0]+arr[0][1]);
            }
        });
        
        //検索条件の指定
        queryrequest.addParameter('WHO', TYPES.NVarChar, q_name);
  
        queryrequest.on('row', function(columns) {  
            //見つかった。
            var record = new Array(con_cnt);
            var i = 0;
            columns.forEach( function(column) {
                record[i++] = column.value;
            });
            arr.push(record);
        });
      
        queryrequest.on('requestCompleted', function(rowCount, more){
            connection.close();
        });
      
        connection.execSql(queryrequest);
        
        return;
    }
}

```

index.jsからよびだしてみる。

```javascript

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
        
        //データベースアクセスと応答
        scan_table(context, req.query.name);
        
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
    context.done();
};

```

# 動かして見る。

![screen4-1.png](https://qiita-image-store.s3.amazonaws.com/0/43829/5fda0151-2486-e692-d3d9-eb8af7ded9d4.png "screen4-1.png")


azureポータルの「実行ボタン」横の「関数のURLの取得」で取り出したURLに対して、別ブラウザーから、?name=xxxをつけて、Functionsを呼び出して見る。xxxが、SQLのWHERE句になる。

azureポータルでは、関数画面を表示したままにする。
すると、azureポータルのログ画面に、結果が出るはず。


![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34333832392f61353236623130342d356130632d633732302d633962662d6632666365666335636433342e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/43829/4c7fc565-956d-ae11-fe4c-d0da373129bf.png "68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34333832392f61353236623130342d356130632d633732302d633962662d6632666365666335636433342e706e67.png")