ADO+OLEDBでTNSをJScriptから直接指定してOracle Databaseにアクセスする

WindowsにおけるOLEDBの良い所は、あらかじめODBCデータソースを設定しておかなくて良いというところだと思う。これは特に複数のクライアントPCにからデータベースにアクセスしなくてはいけない状況で、そのクライアントPCのユーザーがODBCのことを理解していない場合には、重要であると思う。ODBCデータソースに自動登録するスクリプトも書けるものだとは思うが。

しかし、Oracle Databaseにアクセスする場合には、インスタントクライアントのインストールが必要であるのは仕方がないとしても、tnsnames.oraを配置するのは面倒である。

ADOとOLEDBの組み合わせで、TNSの文字列をそのままサーバー名として与えることで、tnsnames.oraに追記する必要はないことが分かったので例を示しておく。

ADOをWindows Scripting Host (WSH)のJScriptから使った場合でまとめておく。


/*
 * テーブルをTSVファイルにダンプする
 * Copyright (c) 2016 Ryo ONODERA, All rights reserved.
 * License: 2-clause BSD
 */

var bTable = "table1";

// Define columns
var columns = ["column1", "column2", "column3", "column4", "column5", "column6", "column7", "column8", "column9", "column10", "column11", "column12"];

// Start
main();

// YYYYMMDDhhmm
function getNow()
{
 var date = new Date();
 //date = new Date(2016, 1, 3);
 var dateString = ("" + date.getFullYear()
  + ("0" + (date.getMonth() + 1)).slice(-2)
  + ("0" + (date.getDate())).slice(-2)
  + ("0" + (date.getHours())).slice(-2)
  + ("0" + (date.getMinutes())).slice(-2)
 );

 // debug
 //var Wsh = WScript.CreateObject("WScript.Shell");
 //Wsh.Popup(dateString);

 return dateString;
}

// Concatenate array with ", "
function concatColumns(columns, delimiter)
{
 var columnsString = "";
 for (var i = 0; i < columns.length - 1 ; i++) {
  columnsString = columnsString + columns[i] + delimiter + " ";
 }
 columnsString = columnsString + columns[columns.length - 1];

 return columnsString;
}

// Get CSV string
function getCsvLine(recordSet, delimiter)
{
 var csvLine = "";
 for (var i = 0; i < recordSet.Fields.Count - 1; i++) {
  csvLine = csvLine + recordSet.Fields(i) + delimiter + " ";
 }
 csvLine = csvLine + recordSet.Fields(recordSet.Fields.Count - 1);

 return csvLine;
}

// Main function
function main() {
 // For Popup
 var Wsh = WScript.CreateObject("WScript.Shell");
 
 var serverName = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = serviceName)))";
 var userName = "username";
 var password = "password";

 // Connect to Oracle DB
 var ADOConn = WScript.CreateObject("ADODB.Connection");
 ADOConn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=" + serverName + ";User ID=" + userName + ";Password=" + password + ";";
 ADOConn.Open();

 var SQLString = "select " + concatColumns(columns, ",") + " from " + bTable;
 //Wsh.Popup(SQLString);
 var rs = ADOConn.Execute(SQLString);

 // Popup debug
 //Wsh.Popup(rs(columns[0]) + rs(columns[1]));

 // Write CSV file
 var outputFileName = "D:\\tmp\\dump\\" + bTable + "-"+ getNow() + ".tsv";
 var fso = WScript.CreateObject("Scripting.FileSystemObject");
 var outputCsvFile = fso.CreateTextFile(outputFileName, true, true);
 outputCsvFile.WriteLine(concatColumns(columns, "\t"));
 while (!rs.EOF) {
  var rsLine = getCsvLine(rs, "\t");
  outputCsvFile.WriteLine(rsLine);
  rs.MoveNext();
 }

 // Finish notification
 //Wsh.Popup("Finished");
}

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

Windows 11 Pro 24H2からSambaのguest ok = yesな共有フォルダーへアクセスする

Microsoft Windows 11 Proを動かしているマシンで、sambaでguest ok = yesにしている共有フォルダーにアクセスしていた。 Windows 11を24H2にアップデートしたところ、その共有フォルダーを開こうとすると、ログインを求められ、...