Click here to Skip to main content
15,897,518 members
Articles / Desktop Programming / WPF

DBTool for Oracle - Part 1

Rate me:
Please Sign up or sign in to vote.
4.92/5 (45 votes)
13 Apr 2014CPOL18 min read 138.6K   5.1K   88  
Enhance productivity and reliability, write your own tools.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Reflection;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;


using Harlinn.Oracle.DBTool.Example.Common;
using Harlinn.Oracle.DBTool.Example.Types;

namespace Harlinn.Oracle.DBTool.Example.DB
{
    [DataObject]
    public partial class EnumerationValueElementAccessor : Accessor
    {

        private static readonly log4net.ILog sfLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        private static void LogException(Exception exc, MethodBase method)
        {
            Logger.LogException(sfLog, exc, method);
        }



        public const string SCHEMA = "HARLINN";
        public const string TABLE = "ENUMERATION_VALUES";
        public const string DB_QUALIFIED_NAME = "HARLINN.ENUMERATION_VALUES";


        public static DataTable CreateDataTable()
        {
            try
            {
                DataTable result = new DataTable();

                DataColumn idDataColumn = new DataColumn( "ID", typeof(decimal) );
                idDataColumn.AllowDBNull = false;
                result.Columns.Add(idDataColumn);
                DataColumn enumerationDataColumn = new DataColumn( "ENUMERATION", typeof(decimal) );
                enumerationDataColumn.AllowDBNull = false;
                result.Columns.Add(enumerationDataColumn);
                DataColumn nameDataColumn = new DataColumn( "NAME", typeof(string) );
                nameDataColumn.AllowDBNull = false;
                result.Columns.Add(nameDataColumn);
                DataColumn valueDataColumn = new DataColumn( "VALUE", typeof(decimal) );
                valueDataColumn.AllowDBNull = false;
                result.Columns.Add(valueDataColumn);
                DataColumn optimisticLockDataColumn = new DataColumn( "OPTIMISTIC_LOCK", typeof(decimal) );
                optimisticLockDataColumn.AllowDBNull = false;
                result.Columns.Add(optimisticLockDataColumn);
                DataColumn descriptionDataColumn = new DataColumn( "DESCRIPTION", typeof(string) );
                descriptionDataColumn.AllowDBNull = true;
                result.Columns.Add(descriptionDataColumn);
                DataColumn commentsDataColumn = new DataColumn( "COMMENTS", typeof(string) );
                commentsDataColumn.AllowDBNull = true;
                result.Columns.Add(commentsDataColumn);

                DataColumn[] keys = new DataColumn[1];
                keys[0] = idDataColumn;
                result.PrimaryKey = keys;

                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static DataTable CreateDataTable( List<EnumerationValueElementData> elements )
        {
            try
            {
                DataTable result = CreateDataTable();
                foreach(EnumerationValueElementData element in elements)
                {
                    object id = element.Id;
                    object enumeration = element.Enumeration;
                    object name = element.Name;
                    object value = element.Value;
                    object optimisticLock = element.OptimisticLock;
                    object description;
                    if( element.Description != null )
                    {
                        description = element.Description;
                    }
                    else
                    {
                        description = null;
                    }
                    object comments;
                    if( element.Comments != null )
                    {
                        comments = element.Comments;
                    }
                    else
                    {
                        comments = null;
                    }
                    result.Rows.Add(id,enumeration,name,value,optimisticLock,description,comments );
                }

                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static void WriteToServer( OracleConnection oracleConnection, string qualifiedDBName, DataTable dataTable )
        {
            try
            {
                using ( OracleBulkCopy bulkCopy = new OracleBulkCopy( oracleConnection ) )
                {
                    bulkCopy.DestinationTableName = qualifiedDBName;
                    bulkCopy.WriteToServer( dataTable );
                }
            }
            catch ( Exception exc )
            {
                LogException( exc, MethodBase.GetCurrentMethod( ) );
                throw;
            }
        }


        [DataObjectMethod(DataObjectMethodType.Select,true)]
        public static List<EnumerationValueElementData> GetAll( )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                List<EnumerationValueElementData> result = new List<EnumerationValueElementData>( );
                EnumerationValueElementReader elementReader = new EnumerationValueElementReader( qualifiedDBName );
                using( elementReader )
                {
                    while( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result.Add(element);
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static List<EnumerationValueElementData> GetAll( OracleConnection oracleConnection )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                List<EnumerationValueElementData> result = new List<EnumerationValueElementData>( );
                EnumerationValueElementReader elementReader = new EnumerationValueElementReader( oracleConnection, qualifiedDBName );
                using( elementReader )
                {
                    while( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result.Add(element);
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static KeyedEnumerationValueCollection GetKeyedCollection( )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                KeyedEnumerationValueCollection result = new KeyedEnumerationValueCollection( );
                EnumerationValueElementReader elementReader = new EnumerationValueElementReader( qualifiedDBName );
                using( elementReader )
                {
                    while( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result.Add(element);
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetById(  long id )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderById( qualifiedDBName,id );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetById( OracleConnection oracleConnection,  long id )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderById( oracleConnection ,qualifiedDBName,id );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetByEnumerationAndName(  long enumeration, string name )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderByEnumerationAndName( qualifiedDBName,enumeration,name );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetByEnumerationAndName( OracleConnection oracleConnection,  long enumeration, string name )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderByEnumerationAndName( oracleConnection ,qualifiedDBName,enumeration,name );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetByEnumerationAndValue(  long enumeration, long value )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderByEnumerationAndValue( qualifiedDBName,enumeration,value );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static EnumerationValueElementData GetByEnumerationAndValue( OracleConnection oracleConnection,  long enumeration, long value )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                EnumerationValueElementData result = null;
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderByEnumerationAndValue( oracleConnection ,qualifiedDBName,enumeration,value );
                using( elementReader )
                {
                    if( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result = element;
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        [DataObjectMethod(DataObjectMethodType.Select,false)]
        public static List<EnumerationValueElementData> GetByEnumeration(  long enumeration )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                List<EnumerationValueElementData> result = new List<EnumerationValueElementData>( );
                EnumerationValueElementReader elementReader = EnumerationValueElementReader.CreateReaderByEnumeration( qualifiedDBName,enumeration );
                using( elementReader )
                {
                    while( elementReader.Read( ) )
                    {
                        EnumerationValueElementData element = elementReader.EnumerationValue;
                        result.Add( element );
                    }
                }
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Insert( EnumerationValueElementData element )
        {
            try
            {
                EnumerationValueElementData result = null;
                int recordsInserted = Insert( GetConnection(), element, out result );
                return recordsInserted;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Insert( EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                int recordsInserted = Insert( GetConnection(), element, out result );
                return recordsInserted;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Insert( OracleConnection oracleConnection, EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                int recordsInserted = 0;
                result = null;

                OracleCommand oracleCommand = oracleConnection.CreateCommand();
                using (oracleCommand)
                {
                    oracleCommand.BindByName = true;

                    string insertSQLStatement = "INSERT INTO {0}(ID,ENUMERATION,NAME,VALUE,OPTIMISTIC_LOCK,DESCRIPTION,COMMENTS) " +
                    " VALUES(SEQ_ENUMERATION_VALUES.NEXTVAL, :enumeration_, :name_, :value_, 0, :description_, :comments_)" +
                    " RETURNING ID INTO :id_";
                    string finalInsertSQLStatement = string.Format(insertSQLStatement,qualifiedDBName);

                    oracleCommand.CommandText = finalInsertSQLStatement;


                    OracleParameter idParameter = oracleCommand.Parameters.Add(new OracleParameter( ":id_", OracleDbType.Decimal ));
                    idParameter.Direction = ParameterDirection.Output;

                    OracleParameter enumerationParameter = oracleCommand.Parameters.Add(new OracleParameter( ":enumeration_", OracleDbType.Decimal ));
                    enumerationParameter.Value = element.Enumeration;

                    OracleParameter nameParameter = oracleCommand.Parameters.Add(new OracleParameter( ":name_", OracleDbType.NVarchar2 ));
                    nameParameter.Value = element.Name;

                    OracleParameter valueParameter = oracleCommand.Parameters.Add(new OracleParameter( ":value_", OracleDbType.Decimal ));
                    valueParameter.Value = element.Value;

                    OracleParameter descriptionParameter = oracleCommand.Parameters.Add(new OracleParameter( ":description_", OracleDbType.NClob ));
                    if( element.Description != null )
                    {
                        descriptionParameter.Value = element.Description;
                    }
                    else
                    {
                        descriptionParameter.IsNullable = true;
                        descriptionParameter.Value = null;
                    }

                    OracleParameter commentsParameter = oracleCommand.Parameters.Add(new OracleParameter( ":comments_", OracleDbType.NClob ));
                    if( element.Comments != null )
                    {
                        commentsParameter.Value = element.Comments;
                    }
                    else
                    {
                        commentsParameter.IsNullable = true;
                        commentsParameter.Value = null;
                    }



                    recordsInserted = oracleCommand.ExecuteNonQuery();
                    if( recordsInserted != 0)
                    {
                        result = element;
                        result.Id = ((OracleDecimal)idParameter.Value).ToInt64();
                        result.ElementState = ElementState.Stored;
                    }
                }

                return recordsInserted;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }



        public static void Insert( List<EnumerationValueElementData> elements )
        {
            try
            {
                Insert( GetConnection(), elements);
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static void Insert( OracleConnection oracleConnection, List<EnumerationValueElementData> elements )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                DataTable dataTable = CreateDataTable( elements );
                using (dataTable)
                {
                    WriteToServer(oracleConnection,qualifiedDBName,dataTable);
                }
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Update( EnumerationValueElementData element )
        {
            try
            {
                EnumerationValueElementData result = null;
                int recordsUpdated = Update(GetConnection(), element, out result);
                return recordsUpdated;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static int Update( EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                int recordsUpdated = Update(GetConnection(), element, out result);
                return recordsUpdated;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static int Update( OracleConnection oracleConnection, EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                int recordsUpdated = 0;
                result = null;

                OracleCommand oracleCommand = oracleConnection.CreateCommand();
                using (oracleCommand)
                {
                    oracleCommand.BindByName = true;
                    string updateSQLStatement = "UPDATE {0} SET " +
                            "ENUMERATION = :enumeration_ , " +
                            "NAME = :name_ , " +
                            "VALUE = :value_ , " +
                            "OPTIMISTIC_LOCK = OPTIMISTIC_LOCK + 1, " +
                            "DESCRIPTION = :description_ , " +
                            "COMMENTS = :comments_ " +
                        " WHERE " + 
                            "(ID = :id_) AND " +
                            "(OPTIMISTIC_LOCK = :optimisticLock_) " +
                    " RETURNING OPTIMISTIC_LOCK  INTO :optimisticLock_";

                    string finalUpdateSQLStatement = string.Format(updateSQLStatement,qualifiedDBName);

                    oracleCommand.CommandText = finalUpdateSQLStatement;


                    OracleParameter idParameter = oracleCommand.Parameters.Add(new OracleParameter( ":id_", OracleDbType.Decimal ));
                    idParameter.Value = element.Id;

                    OracleParameter enumerationParameter = oracleCommand.Parameters.Add(new OracleParameter( ":enumeration_", OracleDbType.Decimal ));
                    enumerationParameter.Value = element.Enumeration;

                    OracleParameter nameParameter = oracleCommand.Parameters.Add(new OracleParameter( ":name_", OracleDbType.NVarchar2 ));
                    nameParameter.Value = element.Name;

                    OracleParameter valueParameter = oracleCommand.Parameters.Add(new OracleParameter( ":value_", OracleDbType.Decimal ));
                    valueParameter.Value = element.Value;

                    OracleParameter optimisticLockParameter = oracleCommand.Parameters.Add(new OracleParameter( ":optimisticLock_", OracleDbType.Decimal ));
                    optimisticLockParameter.Direction = ParameterDirection.InputOutput;
                    optimisticLockParameter.Value = element.OptimisticLock;

                    OracleParameter descriptionParameter = oracleCommand.Parameters.Add(new OracleParameter( ":description_", OracleDbType.NClob ));
                    if( element.Description != null )
                    {
                        descriptionParameter.Value = element.Description;
                    }
                    else
                    {
                        descriptionParameter.IsNullable = true;
                        descriptionParameter.Value = null;
                    }

                    OracleParameter commentsParameter = oracleCommand.Parameters.Add(new OracleParameter( ":comments_", OracleDbType.NClob ));
                    if( element.Comments != null )
                    {
                        commentsParameter.Value = element.Comments;
                    }
                    else
                    {
                        commentsParameter.IsNullable = true;
                        commentsParameter.Value = null;
                    }




                    recordsUpdated = oracleCommand.ExecuteNonQuery();
                    if( recordsUpdated != 0)
                    {
                        result = element;
                        result.OptimisticLock = ((OracleDecimal)optimisticLockParameter.Value).ToInt64();
                        result.ElementState = ElementState.Stored;
                    }
                    else
                    {
                        EnumerationValueElementReader reader =  EnumerationValueElementReader.CreateReaderById(oracleConnection, qualifiedDBName,element.Id);
                        using (reader)
                        {
                            result = element;
                            if (reader.Read())
                            {
                                result.ElementState = ElementState.ConcurrencyConflict;
                                result.ConcurrencyConflictElement = reader.EnumerationValue;
                            }
                            else
                            {
                                result.ElementState = ElementState.Deleted;
                            }
                        }
                    }
                }

                return recordsUpdated;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Save( EnumerationValueElementData element )
        {
            try
            {
                EnumerationValueElementData result = null;
                int recordsSaved = Save(GetConnection(), element, out result);
                return recordsSaved;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        public static int Save( EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                int recordsSaved = Save(GetConnection(), element, out result);
                return recordsSaved;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Save( OracleConnection oracleConnection, EnumerationValueElementData element, out EnumerationValueElementData result )
        {
            try
            {
                int recordsSaved = 0;
                result = null;

                if (element.ElementState == ElementState.New)
                {
                    recordsSaved = Insert(oracleConnection, element, out result);
                }
                else if (element.ElementState == ElementState.Changed)
                {
                    recordsSaved = Update(oracleConnection, element, out result);
                }

                return recordsSaved;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static List<EnumerationValueElementData> Save( List<EnumerationValueElementData> elements )
        {
            try
            {
                List<EnumerationValueElementData> result = Save(GetConnection(), elements);
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static List<EnumerationValueElementData> Save( OracleConnection oracleConnection, List<EnumerationValueElementData> elements )
        {
            try
            {
                //string qualifiedDBName = DB_QUALIFIED_NAME;
                List<EnumerationValueElementData> result = null;

                OracleCommand oracleCommand = oracleConnection.CreateCommand();
                using (oracleCommand)
                {
                }

                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


        public static int Delete( long id, long optimisticLock )
        {
            try
            {
                int result = Delete(GetConnection(), id, optimisticLock);
                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }

        private const string DELETE_STATEMENT = "DELETE FROM {0} WHERE ID = :id AND OPTIMISTIC_LOCK = :optimisticLock";
        public static int Delete( OracleConnection oracleConnection, long id, long optimisticLock )
        {
            try
            {
                string qualifiedDBName = DB_QUALIFIED_NAME;
                int result = 0;

                OracleCommand oracleCommand = oracleConnection.CreateCommand();
                using (oracleCommand)
                {
                    string deleteStatement = string.Format(DELETE_STATEMENT, qualifiedDBName);
                    oracleCommand.CommandText = deleteStatement;


                    OracleParameter idParameter = oracleCommand.Parameters.Add(new OracleParameter( ":id", OracleDbType.Decimal ));
                    idParameter.Value = id;


                    result = oracleCommand.ExecuteNonQuery();
                }

                return result;
            }
            catch (Exception exc)
            {
                LogException(exc, MethodBase.GetCurrentMethod());
                throw;
            }
        }


    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions