0

CMD によって呼び出される VBScript を介して SQL 要求を作成したいと考えています。データベースはSybaseサーバーであり、これが問題です。これに関するドキュメントは見つかりません。MS SQLなどだけです。

しかし、このような複雑な方法である必要はありません。リクエストが実行されたときにリクエストを出力する小さなツールを誰かが知っていれば、私もうれしいです.

しかし、主な目的は、プログラム (またはスクリプト) の実行時に要求されたデータを出力することです。

アップデート

参考になりそうなものを見つけました

Dim OdbcDSN
Dim connect, sql, resultSet

OdbcDSN = "******;UID=*******;PWD=*****"
Set connect = CreateObject("ADODB.Connection")
connect.Open OdbcDSN

sql="SELECT * FROM **********..********** WHERE ******* = 1 AND Name = %given parameter%"

resultSet.Close
connect.Close
Set connect = Nothing

WScript.Quit(0)

追記: バッチ (または何でも) は電話クライアントによって実行されます。電話クライアントは、電話をかけている人の名前であるパラメーターを使用してバッチ (またはプログラム) を呼び出します。したがって、パラメーターをクエリに組み込むことができれば、それは素晴らしいことです。

4

1 に答える 1

0

私は同じタスクを持っていますが、標準の ADODB.Connection を使用して接続できないようです。いくつか調査したところ、iAnywhere.Data.SQLAnywhere lib と独自の SybaseConnector.Connector を使用して Sybase に接続する必要があることがわかりました。バッチを使用して vb vbscript ファイルを呼び出す代わりに、SybaseConnector を使用して独自の COM オブジェクトを作成し、それをシステムに登録して新しいオブジェクトを作成するか、ソネクション文字列とクエリを受け取る実行可能ファイルを作成できます。ソースを共有できます。

Sybase IQ 15.4 dev エディションをセットアップしてから、Visual Studio でプロジェクトを作成し、.NET コンポーネント iAnywhere.Data.SQLAnywhere への参照を作成します。

次に、次のコードを使用します。

using System;
using System.Collections.Generic;
using System.Text;
using iAnywhere.Data.SQLAnywhere;
using System.Diagnostics;
using System.Data;

namespace SybaseConnector
{
    public class Connector
    {
        private SAConnection                _myConnection { get; set; }
        private SADataReader                _data { get; set; }
        private SACommand                   _comm { get; set; }
        private SAConnectionStringBuilder   _conStr { get; set; }
        public  bool                        isDebug { get; set; }

        public Connector(string UserID, string Password, string CommLinks, string ServerName, string command)
        {
            _conStr = new SAConnectionStringBuilder();

           // dynamic
            _conStr.UserID               = UserID;       //"dba";
            _conStr.Password             = Password;     //"sql";
            _conStr.CommLinks            = CommLinks;    //@"TCPIP{IP=servername;ServerPort=2638}";
            _conStr.ServerName           = ServerName;   //"northwind";

            // static
            _conStr.Compress             = "NO";
            _conStr.DisableMultiRowFetch = "NO";
            _conStr.Encryption           = "NONE";
            _conStr.Integrated           = "NO";

            this.Connect();
            this.ExecuteCommand(command);
            this.WriteResult();
        }

        public  void Connect()
        {
            _myConnection = new SAConnection();
            _myConnection.StateChange += new StateChangeEventHandler(ConnectionControl);

            if (_conStr.ToString() != String.Empty) 
            {
                try
                {
                    _myConnection.ConnectionString = _conStr.ToString();
                    _myConnection.Open();

                }
                catch(Exception e) 
                {
                    if ((int)_myConnection.State == 0)
                    {
                        _myConnection.Dispose();
                        WriteDebug("Exception data:\n"    + e.Data + "\n" +
                                   "Exception message:\n" + e.Message + "\n" + 
                                   "Inner exception:\n"   + e.InnerException + "\n" + 
                                   "StackTrace:\n"        + e.StackTrace);
                    }
                }
            }
        }

        public  void ExecuteCommand(string com, int timeout = 600)
        {
            if ((int)_myConnection.State != 0)
            {
                _comm                = new SACommand();
                _comm.CommandText    = com;
                _comm.CommandTimeout = timeout;
                _comm.Connection     = _myConnection;

                try
                {
                    _data = _comm.ExecuteReader();
                }
                catch (Exception e)
                {
                    WriteDebug("Exception data:\n"    + e.Data           + "\n" +
                               "Exception message:\n" + e.Message        + "\n" +
                               "Inner exception:\n"   + e.InnerException + "\n" +
                               "StackTrace:\n"        + e.StackTrace);
                }
            }
            else 
            {
                WriteDebug("Exception occured:\n" +
                           "Connection has been closed before the command has been executed.");
            }
        }

        private void ConnectionControl(object sender, StateChangeEventArgs e)
        {
            WriteDebug(sender.GetType().ToString() + ": Connection state changed to " + e.CurrentState.ToString());
        }

        public  void SetMaxReconnectCount(int count)
        {
            _reconnectCounter = count;
        }

        public  void Dispose()
        {
            _comm.Dispose();
            _data.Dispose();            
            _myConnection.Close();
            _myConnection.Dispose();
        }

        private void WriteResult()
        {
            var output = new StringBuilder();

            int count = _data.FieldCount;
            // аппенд в строку и вывод в ивент одним объектом
            for (int i = 0; i < count; i++)
            {
                if (i == count - 1)
                {
                    output.Append(_data.GetName(i) + "\n");
                }
                else
                {
                    output.Append(_data.GetName(i) + "\t");
                }
            }
            while (_data.Read())
            {
                for (int i = 0; i < count; i++)
                {
                    if (i == count - 1)
                    {
                        output.Append(_data.GetValue(i) + "\n");
                    }
                    else
                    {
                        output.Append(_data.GetValue(i) + "\t");
                    }
                }
            }

            WriteDebug(output.ToString());
        }

        private void WriteDebug(string str, EventLogEntryType type = EventLogEntryType.Information)
        {
            System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
            appLog.Source = "SQL SybaseConnector";
            appLog.WriteEntry(str, EventLogEntryType.Information);
        }
    }
}

COM オブジェクトとして使用する場合は、[ComVisible(true)] フラグを設定します。プロジェクトをコンパイルし、コマンドで dll を登録します

>regasm myTest.dll

次に、あなたのvbscriptコードで

Dim obj
Set obj = CreateObject("SybaseConnector.Connector")
Call obj.Connector("user","password","TCPIP{IP=host;ServerPort=2638}","northwind",command)
于 2013-11-14T16:01:49.830 に答える