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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。