備忘錄_20160105(定位) 修改 回首頁

程式 2020-05-21 16:58:38 1590051518 100
node.js 讀取 sql server (同步版本)

node.js 讀取 sql server (同步版本)
// https://tediousjs.github.io/tedious/index.html
//
// mkdir project01
// cd    project01
// npm install tedious
//
// notepad test2.js (請參考下方程式碼)
// node test2.js 

async function getStrConn(strIP, iPort, strUsername, strPassword, strDatabase, oPara)
{
  // oPara.oConn 連線物件
  
  var oConnection = require('tedious').Connection;
  var strErr="";
  oPara.oConn=null;
  
  var oConfig = 
  {  
    server: strIP,  //update me
    authentication: 
    {
      type: 'default',
      options: 
      {
        userName: strUsername, //update me
        password: strPassword  //update me
      }
    },
    options: 
    {
      trustServerCertificate: false,
      // If you are on Microsoft Azure, you need encryption:
      encrypt: false,
      database: strDatabase,  //update me
      port: iPort
    }
  };
  
  await new Promise
  (
    (成功, 失敗)=>
    {
      oPara.oConn = new oConnection(oConfig);
      
      oPara.oConn.on
      (
        'connect',
        function(err)
        {
          if(err) { 失敗(err); }
          else    { 成功(); }
        }
      )
      
      oPara.oConn.connect();
    }
  )
  .then(     ()=>{ strErr="";                           } )
  .catch( (err)=>{ strErr="err:"+err; oPara.oConn=null; } );
  
  return strErr;
}

async function getStrQuery(strSQL, oConn, oPara)
{
  // oPara.lRowCount 總異動筆數
  // oPara.straColName 欄位名稱一維陣列
  // oPara.oaArray 欄位值二維陣列
  
  var Request = require('tedious').Request;
  var strErr="";
  oPara.straColName=[];
  oPara.oaArray=[];
  
  await new Promise
  (
    (成功, 失敗)=>
    {
      request=new Request
      (
        strSQL,
        function(err, rowCount)
        {
          if(err) { 失敗(err);      }
          else    { 成功(rowCount); }
        }
      );
      
      request.on
      (
        'row',
        function(columns)
        {
          // 標題
          if(oPara.straColName.length==0)
          {
            columns.forEach
            (
              function(column)
              {
                oPara.straColName.push(column.metadata.colName);
              }
            );
          }
          
          // 值
          var oaAry1D=[];
          columns.forEach
          (
            function(column)
            {
              if(column.value===null) { oaAry1D.push("");           }
              else                    { oaAry1D.push(column.value); }
            }
          );
          oPara.oaArray.push(oaAry1D);
        }
      );

      oConn.execSql(request);
    }
  )
  .then( (rowCount)=>{ strErr=""; oPara.lRowCount=rowCount; } )
  .catch( (err)=>    { strErr="err:"+err; } );
  
  return strErr;
}

async function main()
{
  var oConn=null;
  
  var oPara;
  var strErr="";
  
  while(true)
  {
    { // 建立資料庫連線
      oPara={};
      strErr=await getStrConn("192.168.1.88", 1433, "username", "password", "databasename", oPara);
      if(strErr!="") 
      {
        console.log("抱歉,連線失敗!\r\n"+strErr);
       break;
      } 
      oConn=oPara.oConn;
    }
    
    if(1==0)
    { // 執行指令 ins,upd,del,sel,create,drop,......
      oPara={};
      // create table tb2(i int, nvc nvarchar(32) not null default '')
      // insert into tb2(i,nvc) select 1,'haha' union select 2,'good'
      // select nvc,i from tb2
      // drop table tb2
      strErr=await getStrQuery("select nvc,i from tb2", oConn, oPara);
      if(strErr!="")
      {
        console.log("抱歉,失敗!\r\n"+strErr);
      }
      else
      {
        console.log("rowCount="+oPara.lRowCount);
        console.log(oPara.straColName);
        console.log(oPara.oaArray);
      }
    }
    
    { // 執行查詢,物品
      oPara={};
      strErr=await getStrQuery("select top 6 物品代碼, 綜合名稱 from vw物品 where 物品代碼 like 'BP%'", oConn, oPara);
      if(strErr!="")
      {
        console.log("抱歉,查詢失敗!\r\n"+strErr);
      }
      else
      {
        console.log("rowCount="+oPara.lRowCount);
        console.log(oPara.straColName);
        console.log(oPara.oaArray);
      }
    }
    
    { // 執行查詢,個體
      oPara={};
      strErr=await getStrQuery("select top 3 個體代碼, 中文名稱 from 個體 where 個體代碼 like '1003%'", oConn, oPara);
      if(strErr!="")
      {
        console.log("抱歉,查詢失敗!\r\n"+strErr);
      }
      else
      {
        console.log("rowCount="+oPara.lRowCount);
        console.log(oPara.straColName);
        console.log(oPara.oaArray);
      }
    }
    
    break;
  }
  
  if(oConn!==null) { oConn.close(); oConn==null; } // 關閉資料庫連線
  
  console.log("Finished");
}

main();